Pra*_*eep 10 java singleton synchronized thread-safety
可能重复:
在Java中实现单例模式的有效方法
我正在阅读这篇关于Java的最佳单例实现,但它不是线程安全的.
根据维基:
if(singleton==null) { synchronized(Singleton.class) { // this is needed if two threads are waiting at the monitor at the // time when singleton was getting instantiated if(singleton==null) singleton= new Singleton(); }
}
但是Find Bugs实用程序在此中给出了两个错误:1.双重空检查.2.静态字段的延迟初始化不正确.
什么是最好的方法,
这是对的吗 :
Run Code Online (Sandbox Code Playgroud)synchronized (Singleton.class) { if (singleton== null) { singleton= new Singleton(); } }
Pet*_*rey 21
使用懒惰加载Singleton的最有效/最简单的方法就是
enum Singleton {
INSTANCE
}
Run Code Online (Sandbox Code Playgroud)
注意:不需要锁定,因为类加载是线程安全的.默认情况下,该类是final,并且不能通过反射调用构造函数.在使用INSTANCE或类之前,不会创建INSTANCE.如果您担心该类可能会被意外使用,您可以将单例包装在内部类中.
final class Singleton {
private Singleton() { }
static class SingletonHolder {
static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
Run Code Online (Sandbox Code Playgroud)
恕我直言,你必须非常偏执才能认为这是一个更好的解决方案.
归档时间: |
|
查看次数: |
24416 次 |
最近记录: |