Java 理想情况下,我应该如何在不使用任何同步的情况下编写单例和线程安全类
我试着使用渴望加载编写一个单例类,请参见下面的解决方案。我已经将构造函数设置为私有以防止访问,并且将成员字段设置为私有,因此不能在类范围之外访问它Java 理想情况下,我应该如何在不使用任何同步的情况下编写单例和线程安全类,java,thread-safety,Java,Thread Safety,我试着使用渴望加载编写一个单例类,请参见下面的解决方案。我已经将构造函数设置为私有以防止访问,并且将成员字段设置为私有,因此不能在类范围之外访问它 public class Test { private static Test t = new Test(); private Test() { } public static Test getInstance() { return t; } } 那么,考虑到所有的场景,这一部分是
public class Test {
private static Test t = new Test();
private Test() {
}
public static Test getInstance() {
return t;
}
}
那么,考虑到所有的场景,这一部分是线程安全的吗?使用枚举单例模式:
public enum xxton {
INSTANCE;
}
由于单例模式是关于拥有一个私有构造函数并调用一些方法来控制实例化(比如一些getInstance
),所以在枚举中我们已经有了一个隐式私有构造函数
我不知道JVM或某些容器是如何控制我们的枚举的实例的,但它似乎已经使用了隐式的单例模式
,区别在于我们不调用getInstance
,我们只调用枚举。
一般来说,您可以提供如下方法:
protected Object readResolve() {
return myInstance;
}
答案的可能副本是链接副本。不过,您应该将静态字段设置为最终字段。那么就完成了。使用单例枚举。就这么简单。定义所有场景,因为在序列化+反序列化之后仍然会有两个实例。要修复,请检查@Sebastian谢谢,Nico Van Belle,是的正确我需要编写readResolve方法来防止因此,除了使用枚举,我还试图了解如何在不使用任何同步关键字的情况下设计好singleton。我们有许多类似的答案,已在问题评论部分提到。此答案与来自和的复制/粘贴答案混合使用。为管理员标记它