五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

Kotlin by lazy 實(shí)現(xiàn)原理

2022-03-14 21:21 作者:房頂上的鋁皮水塔  | 我要投稿


本文的目錄如下:

  1. by lazy 到底是什么東西,怎么實(shí)現(xiàn)創(chuàng)建一個(gè)線程安全的單例?

  2. Kotlin contract是什么

內(nèi)容開(kāi)始:

by lazy 到底是什么東西,怎么實(shí)現(xiàn)創(chuàng)建一個(gè)線程安全的單例?

我們通??梢允褂胋y viewModels就可以創(chuàng)建一個(gè)ViewModel供我們使用,不過(guò)這次先不談by viewModels(),我們看看by lazy:

如果直接寫(xiě)by lazy {} 會(huì)默認(rèn)返回一個(gè)SynchronizedLazyImpl

SyncrhonizedLazyImpl實(shí)現(xiàn)了Lazy接口,同樣實(shí)現(xiàn)了這個(gè)接口的還有后續(xù)會(huì)談及的ViewModelLazy。value表示一個(gè)不可變屬性,在SynchronizedLazyImpl中的實(shí)現(xiàn)如下:

本質(zhì)上還是一個(gè)雙重校驗(yàn)鎖的實(shí)現(xiàn)。不過(guò)Kotlin中是沒(méi)有synchronized塊的,這里使用了一個(gè)函數(shù)實(shí)現(xiàn)了這個(gè)效果:

monitorEnter和monitorExit看不到具體的實(shí)現(xiàn),這里不知道用了什么黑科技,不過(guò)應(yīng)該和JVM的monitorEnter和monitorExit的效果類似。這里需要具體說(shuō)一下是contract。

Kotlin contract是什么

參考內(nèi)容:

// Kotlin中的契約:https://droidyue.com/blog/2019/08/25/kotlin-contract-between-developers-and-the-compiler/

Kotlin contract表示Kotlin編譯器和開(kāi)發(fā)者之間的一個(gè)協(xié)定,請(qǐng)看如下的代碼:

傳入的safeRun lambda編譯器不知道它的執(zhí)行次數(shù),這樣有可能會(huì)修改val變量AppVersion,無(wú)法確定safeRun執(zhí)行時(shí),getAppVersion是否執(zhí)行完畢。

所以我們需要加一個(gè)constract告訴編譯器一些額外的信息:

通過(guò)callsInPlace確定runFunction只會(huì)在safeRun執(zhí)行時(shí)執(zhí)行,同時(shí)設(shè)置EXACTLY_ONCE確定只會(huì)執(zhí)行一次。

Kotlin by lazy 實(shí)現(xiàn)原理的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
汨罗市| 临夏县| 富蕴县| 海城市| 闽清县| 博兴县| 桂平市| 铜川市| 平山县| 会理县| 宝鸡市| 鱼台县| 巴楚县| 册亨县| 永仁县| 织金县| 喜德县| 巴彦淖尔市| 穆棱市| 广安市| 三台县| 柘荣县| 衡山县| 扶余县| 怀远县| 潢川县| 开原市| 新巴尔虎左旗| 嵩明县| 利津县| 陆川县| 边坝县| 青阳县| 共和县| 屏东市| 商南县| 灌南县| 孝义市| 吐鲁番市| 易门县| 唐海县|