DEVLOG 9.24 Kotlin 去糖化(1)object 和单例模式
饿汉式单例模式
使用object 关键字在Kotlin中可以定义一个基本的饿汉式单例模式。
饿汉式单例模式:因为很饿,上来就要吃!
类初始化时就初始化,单例为final。饿汉式是线程安全的
反编译的字节码:
懒汉式单例模式
懒汉式单例模式:懒汉很懒,只有当单例没有初始化时才进行初始化。
是一种懒加载的模式,这种模式不是线程安全的
这种方式不是线程安全的,假设存在两条线程,Thread1判断singleton=null为true之后切换到Thread2,Thread2判断single==null 为true之后重复创建Singleton对象。之后当使用权再次交给Thread1时,创建的两个对象并不是同一个。

使用同步锁保证懒汉式线程安全:
使用同步锁使得当前的线程如果要访问这个方法需要等上个线程结束。
使用双重校验锁实现单例模式

实现Java版本的双重校验锁需要注意两个问题
单例变量需要加上volatile
双重校验锁的写法
实现Kotlin版本的时候直接可以将单例变量使用委托的方式实现。
lazy {} 会将传入的initializer根据设置的mode初始化变量
双重校验锁的实现就在SynchronizedLazyImpl中。并且这里的by(委托语法)实际上是一个表达式:

