DEVLOG 9.24 Kotlin 去糖化(1)object 和單例模式
餓漢式單例模式
使用object 關(guān)鍵字在Kotlin中可以定義一個基本的餓漢式單例模式。
餓漢式單例模式:因為很餓,上來就要吃!
類初始化時就初始化,單例為final。餓漢式是線程安全的
反編譯的字節(jié)碼:
懶漢式單例模式
懶漢式單例模式:懶漢很懶,只有當(dāng)單例沒有初始化時才進(jìn)行初始化。
是一種懶加載的模式,這種模式不是線程安全的
這種方式不是線程安全的,假設(shè)存在兩條線程,Thread1判斷singleton=null為true之后切換到Thread2,Thread2判斷single==null 為true之后重復(fù)創(chuàng)建Singleton對象。之后當(dāng)使用權(quán)再次交給Thread1時,創(chuàng)建的兩個對象并不是同一個。

使用同步鎖保證懶漢式線程安全:
使用同步鎖使得當(dāng)前的線程如果要訪問這個方法需要等上個線程結(jié)束。
使用雙重校驗鎖實現(xiàn)單例模式

實現(xiàn)Java版本的雙重校驗鎖需要注意兩個問題
單例變量需要加上volatile
雙重校驗鎖的寫法
實現(xiàn)Kotlin版本的時候直接可以將單例變量使用委托的方式實現(xiàn)。
lazy {} 會將傳入的initializer根據(jù)設(shè)置的mode初始化變量
雙重校驗鎖的實現(xiàn)就在SynchronizedLazyImpl中。并且這里的by(委托語法)實際上是一個表達(dá)式:
標(biāo)簽: