class MyClass
{
private static volatile Resource resource;
public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}
我的疑问是,根据Java并发实践,如果使用volatile,则会发生安全发布(即一旦引用对另一个线程可见,则数据也可用)。那么我可以在这里使用它吗?但如果是正确的,假设线程1现在检查“resource”,并且它为null,因此它开始创建对象。当线程1正在创建对象时,另一个线程即线程2出现并开始检查“resource”的值,并且线程2将其视为null(假设创建“resource”对象需要相当长的时间,并且由于线程1尚未完成创建,因此安全发布尚未发生,因此不可用于线程2),那么它是否也会开始创建对象?如果是,则类不变量破坏了。我理解正确吗?请帮助我特别理解这里使用volatile的含义。
volatile
。根据定义,单例内部的私有实例不会改变,这意味着没有线程缓存旧值的危险。但是忽略了您当前使用的非线程安全的实现,因为getInstance
未同步。在Java中使用enum
来创建单例。 - Brian Roach