单例模式
2021-01-26 本文已影响0人
浩仔_Boy
kotlin常用写法
class Single {
companion object {
val instance: Single by lazy(LazyThreadSafetyMode.SYNCHRONIZED) {
Single()
}
}
fun getWidth(): Int {
return 1280
}
}
Java常用写法(双检索的方式)
public class Single {
/**
* 加上volatile的作用,防止指令重排,保证多线程访问时的安全性
* 在JVM中,new一个对象操作会做下面三件事:
* 1.给new的Single对象分配空间
* 2.调用Single的构造函数来初始化对象
* 3.将single指向第一步分配的空间
* 但是因为JVM存在指令重排的优化,存在无法保证123顺序执行的情况。
* 有可能会导致线程B调用getInstance()时发现single非空,但是却未初始化,从而出现问题
*/
private volatile static Single single;
public Single() {
}
public static Single getInstance() {
if (single == null) {
synchronized (Single.class) {
if (single == null) {
single = new Single();
}
}
}
return single;
}
}