gpt4 book ai didi

java - Java 中带有 volatile 的单例

转载 作者:太空狗 更新时间:2023-10-29 23:00:44 27 4
gpt4 key购买 nike

class MyClass
{
private static volatile Resource resource;

public static Resource getInstance()
{
if(resource == null)
resource = new Resource();
return resource;
}
}

这里我的疑问是根据实践中的 java 并发性,如果您使用 volatile,就会发生安全发布(即一旦引用对另一个线程可见,数据也可用)。那么我可以在这里使用它吗?但如果它是正确的,那么假设 thread1 现在检查“资源”并且它是空的,所以它开始创建对象。当 thread1 正在创建对象时,另一个线程即 thread2 开始检查“resource”的值并且 thread2 发现它为 null(假设创建“resource”对象需要相当长的时间并且因为 thread1 尚未完成创建所以安全发布尚未发生,因此线程 2 不可用)那么它是否也会开始创建对象?如果是,则类不变量中断。我对么?请帮助我理解 volatile 的这种特殊用法。

最佳答案

你是对的,多个线程可以尝试创建一个 Resource 对象。 Volatile 只是保证如果一个线程更新引用,所有其他线程将看到新的引用,而不是某个缓存的引用。这速度较慢,但​​更安全。

如果你只需要一个延迟加载的资源,你需要做这样的事情:

class MyClass
{
private static volatile Resource resource;
private static final Object LOCK = new Object();

public static Resource getInstance()
{
if(resource == null) {
synchronized(LOCK) { // Add a synch block
if(resource == null) { // verify some other synch block didn't
// write a resource yet...
resource = new Resource();
}
}
}
return resource;
}
}

关于java - Java 中带有 volatile 的单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15077910/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com