public static MySingleton getInstance() {
if (_instance==null) {
synchronized (MySingleton.class) {
_instance = new MySingleton();
}
}
return _instance;
}
1.上面的getInstance方法的实现有缺陷吗?
2.两种实现有什么区别?
public static synchronized MySingleton getInstance() {
if (_instance==null) {
_instance = new MySingleton();
}
return _instance;
}
我在 stackoverflow 中看到了很多关于单例模式的答案,但我发布的问题是要了解在这种特殊情况下方法和块级别的“同步”的主要区别。
1.上面的getInstance实现有缺陷吗
方法?
这是行不通的。您最终可能会得到多个 Singleton 实例。
2.两种实现有什么区别?
第二个可以工作,但需要同步,当您从不同线程对该方法进行大量访问时,这可能会减慢系统速度。
最直接的正确实现:
public class MySingleton{
private static final MySingleton _instance = new MySingleton();
private MySingleton(){}
public static MySingleton getInstance() {
return _instance;
}
}
更短更好(安全序列化):
public enum MySingleton{
INSTANCE;
// methods go here
}
单例的延迟初始化是一个备受关注的话题way与它的实际实用性不成比例(IMO 争论双重检查锁定的复杂性,你的例子是第一步,只不过是一场令人生气的比赛)。
在 99% 的情况下,你根本不需要延迟初始化,或者 Java 的“类首次引用时初始化”就足够了。在剩下的 1% 的情况下,这是最好的解决方案:
public enum MySingleton{
private MySingleton(){}
private static class Holder {
static final MySingleton instance = new MySingleton();
}
static MySingleton getInstance() { return Holder.instance; }
}
See 按需初始化持有者习惯用法
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)