class MyClass
{
private static volatile Resource resource;
public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}
在这里,我的疑问是根据Java并发实践,如果您使用 volatile ,安全的发布方式发生(即,只要该引用对另一个线程可见,那么数据也将可用)。我可以在这里使用它吗?但是,如果正确,则假定线程1现在检查“资源”,并且它为null,因此开始创建对象。当线程1正在创建对象时,另一个线程即线程2出现并开始检查“资源”的值,线程2发现它为空(假设创建“资源”对象需要花费大量时间,并且由于线程1尚未完成创建,因此安全发布尚未发生,因此无法用于线程2)那么它将也开始创建对象吗?如果是,则类不变式中断。我对么?请在这里帮助我了解volatile的这种特殊用法。
最佳答案
volatile解决了一个问题可见性问题。如果要写入一个声明为volatile 的变量,则该值将立即对其他线程可见。众所周知,操作系统L1,L2,L3具有不同级别的缓存,如果我们在一个线程中写入变量,则不能保证对其他线程可见,因此如果使用volatile,它会写入直接内存并可见给别人。但是volatile无法解决原子性的问题,即int a; a++;
不安全。 AS有三个与之关联的机器指令。