少了一个枚举的方式。利用枚举类型来创建Singleton。
下面的文章案例很清晰,看文章。
https://blog.csdn.net/a347911/article/details/53321803
有个专业的说法,叫双检锁
http://www.importnew.com/12196.html
这个文章中,重要的一点:
public static Singleton getInstanceDC() {
if (_instance == null) { // Single Checked
synchronized (Singleton.class) {
if (_instance == null) { // Double checked
_instance = new Singleton();
}
}
}
return _instance;
}
这个方法表面上看起来很完美,你只需要付出一次同步块的开销,但它依然有问题。除非你声明`_instance`变量时使用了[volatile](http://javarevisited.blogspot.sg/2011/06/volatile-keyword-java-example-tutorial.html)关键字。没有`volatile`修饰符,可能出现Java中的另一个线程看到个初始化了一半的`_instance`的情况,但使用了`volatile`变量后,就能保证先行发生关系(happens-before relationship)。对于`volatile`变量`_instance`,所有的写(write)都将先行发生于读(read),在Java 5之前不是这样,所以在这之前使用双重检查锁有问题。现在,有了先行发生的保障(happens-before guarantee),你可以安全地假设其会工作良好。另外,这不是创建线程安全的单例模式的最好方法,你可以使用[枚举实现单例模式](http://javarevisited.blogspot.com/2012/07/why-enum-singleton-are-better-in-java.html),这种方法在实例创建时提供了内置的线程安全。另一种方法是使用静态持有者模式(static holder pattern)
网友评论