【发布时间】:2016-05-23 22:06:54
【问题描述】:
我们在学校学习过设计模式,并像这样学习了单例(惰性/非线程安全的)的实现:
package com.crunchify.tutorials;
public class CrunchifySingleton {
private static CrunchifySingleton instance = null;
protected CrunchifySingleton() {
}
// Lazy Initialization (If required then only)
public static CrunchifySingleton getInstance() {
if (instance == null) {
// Thread Safe. Might be costly operation in some case
synchronized (CrunchifySingleton.class) {
if (instance == null) {
instance = new CrunchifySingleton();
}
}
}
return instance;
}
}
现在我找到了这样的实现:
package com.crunchify.tutorials;
public class ThreadSafeSingleton {
private static final Object instance = new Object();
private ThreadSafeSingleton() {
}
// Runtime initialization
// By defualt ThreadSafe
public static Object getInstance() {
return instance;
}
}
现在我想知道第一个实现何时更有意义,因为根据http://crunchify.com/thread-safe-and-a-fast-singleton-implementation-in-java/,第二个实现是线程安全的并且需要更少的行。
【问题讨论】:
-
是的,但是第二个并不懒。
-
@Kayaman 当单例是惰性的并且不是线程安全的时有什么优势?那是我没有得到的。谢谢你的回答!
-
真正需要单例的次数很少;您实际需要延迟初始化的惰性单例的次数再次变少了。
-
“当单例是惰性的并且不是线程安全的时候有什么好处?”当您想要程序中的可变全局状态和竞争条件时,这是一个优势。你知道,当可预测的行为还不够令人兴奋时。
-
这个以前经常讨论。例如这里stackoverflow.com/questions/70689/…
标签: java design-patterns