实现基于枚举的单例

St.*_*rio 5 java singleton enums

J. Bloch在他的Effective Java中建议我们使用基于枚举的单例实现.例如:

public enum Application {

    INSTANCE;

    //methods, fields

}
Run Code Online (Sandbox Code Playgroud)

这种实现在序列化的情况下很好,因为枚举默认为我们提供了序列化的能力(并且我们不必害怕在反序列化对象时获得两个不同的实例).

我的问题是这个实现如何尊重多线程.如何使其线程安全?如果我们尝试从不同的线程访问它,我们可能得到什么?

ζ--*_*ζ-- 8

实例化实例的实际枚举行为没有线程安全问题.但是,您需要确保实例状态本身是线程安全的.

与字段和方法的交互Application是风险 - 使用谨慎的同步和锁定,或纯粹的并发数据和仔细验证,其他不一致不会发生,这将是你最好的选择.