我正在阅读有关单例模式的维基,我不确定我是否理解这一点:https://en.wikipedia.org/wiki/Initialization-on-demand_holder_idiom正确部分.
所以要简单一点:为什么Bill Pugh的解决方案比上面的例子更好?
是因为VM在实际使用之前没有加载静态类或类似的东西,所以在转向getInstance()方法之前我们不创建对象?那个方法线程安全只是在初始化对象的程度吗?
在java中,我们可以使用双重Checked Locking&volatile编写thead-safe单例:
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance(String arg) {
Singleton localInstance = instance;
if (localInstance == null) {
synchronized (Singleton.class) {
localInstance = instance;
if (localInstance == null) {
instance = localInstance = new Singleton(arg);
}
}
}
return localInstance;
}
}
Run Code Online (Sandbox Code Playgroud)
我们怎么能用kotlin写呢?
object A {
object B {}
object C {}
init {
C.hashCode()
}
}
Run Code Online (Sandbox Code Playgroud)
我使用kotlin反编译器来实现
public final class A {
public static final A INSTANCE;
private A() { …Run Code Online (Sandbox Code Playgroud) 一个共同的(1,2)实现单的方式是使用具有静态构件的内部类:
public class Singleton {
private static class SingletonHolder {
public static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
private Singleton() {
//...
}
}
Run Code Online (Sandbox Code Playgroud)
据说这个实现是懒惰的初始化和线程安全的.但究竟是什么保证了它的线程安全?处理 线程和锁定的JLS 17没有提到静态字段具有任何类型的先发生关系.我怎样才能确定初始化只发生一次并且所有线程都看到同一个实例?