【发布时间】:2015-06-22 14:27:18
【问题描述】:
J。 Bloch 在他的 Effective Java 中建议我们使用基于枚举的单例实现。例如:
public enum Application {
INSTANCE;
//methods, fields
}
这个实现在序列化的情况下很好,因为枚举默认为我们提供了序列化的能力(我们不必害怕在反序列化对象时得到两个不同的实例)。
我的问题是这个实现如何尊重多线程。如何使其线程安全?如果我们尝试从不同的线程访问它,我们可能会得到什么?
【问题讨论】:
-
你让它成为线程安全的,就像你让任何其他对象成为线程安全的一样:确保对其状态的访问是正确同步的。如果它没有状态,它本质上是线程安全的。
-
枚举的优点是它是线程安全初始化的。另一种单例模式需要一个内部类来实现相同的功能,并且更加冗长/神奇。