实现基于枚举的单例
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使用线程安全的数据结构。
J。 Bloch 在他的 Effective Java 中建议我们使用基于枚举的单例实现。例如:
public enum Application {
INSTANCE;
//methods, fields
}
这个实现在序列化的情况下很好,因为枚举默认为我们提供了序列化的能力(而且我们不必害怕在反序列化对象时得到两个不同的实例)。
我的问题是这个实现如何尊重多线程。如何使其成为线程安全的?如果我们尝试从不同的线程访问它,我们可能会得到什么?
实例化实例的实际枚举行为doesn't have an issue with thread safety。但是,您需要确保实例状态本身是线程安全的。
与 Application
的字段和方法的交互是有风险的——使用仔细的同步和锁定,或者使用纯并发数据并仔细验证其他不一致不会发生,将是您最好的选择这里。
Singleton 确保每个 class 加载器只有一个 class 实例。
如果您的单例具有可变状态,您只需要关心并发性。我的意思是如果单身人士坚持某种可变数据。
在这种情况下,您应该使用某种同步锁定机制来防止并发修改状态and/or使用线程安全的数据结构。