在单例设计模式的情况下应该更喜欢什么。
1)make whole getInstance() method synchronized
OR
2)make only critical section synchronized.
一个人的方法应该是什么,为什么?
在单例设计模式的情况下应该更喜欢什么。
1)make whole getInstance() method synchronized
OR
2)make only critical section synchronized.
一个人的方法应该是什么,为什么?
首先,尝试考虑是否需要惰性实例化。如果没有,则不涉及同步,因为您INSTANCE将在类加载时初始化。
如果您确实需要延迟初始化您的实例,请不要进行getInstance同步,因为这会导致您的所有线程在实例初始化后无缘无故地等待对方。
如果您将在内部使用同步块,则需要仔细检查 null(在同步块的外部和内部)以确保最终只有一个实例;此外,您需要您的实例为volatile.
最佳实践方法是拥有一个私有嵌套类SingletonHolder,在加载时初始化单例实例(但仅在getInstance()调用容器类时加载)。
但是,如果您不需要惰性实例化,最佳实践是使用带有一个常量的枚举。
长话短说,我想你会在这里找到这一切:http ://en.wikipedia.org/wiki/Singleton_pattern
我更喜欢使用 an ,enum因为它更简单,并且仍然是线程安全和延迟加载的。
enum Singleton {
INSTANCE;
}
我不会让它变得比它需要的更复杂。
读Item 3自Effective java enforce singleton with property with private constructed or an enum type
最好的解决方案是根本不使用单例。如果您需要在多线程环境中使用单例,请使整体getInstance同步或立即使用静态字段初始化(对于单元测试来说更糟)。
阅读http://www.ibm.com/developerworks/java/library/j-dcl/index.html