实现基于枚举的单例

Implementing enum-based singleton

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

public enum Application {

    INSTANCE;

    //methods, fields

}

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

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

实例化实例的实际枚举行为doesn't have an issue with thread safety。但是,您需要确保实例状态本身是线程安全的。

Application 的字段和方法的交互是有风险的——使用仔细的同步和锁定,或者使用纯并发数据并仔细验证其他不一致不会发生,将是您最好的选择这里。

Singleton 确保每个 class 加载器只有一个 class 实例。

如果您的单例具有可变状态,您只需要关心并发性。我的意思是如果单身人士坚持某种可变数据。

在这种情况下,您应该使用某种同步锁定机制来防止并发修改状态and/or使用线程安全的数据结构。