gpt4 book ai didi

java - 我应该同时使用 lock 和 volatile 吗?

转载 作者:行者123 更新时间:2023-11-30 08:22:29 27 4
gpt4 key购买 nike

我对 volatile 的理解是它确保值总是从内存中读取,据我所知,在下面的示例中,myObject 变量需要是 volatile 以避免引发了一个 NullPointerException:

private final Object lock = new Object();
private MyObject myObject = null;

//...

synchronized (lock) {
if (myObject == null) {
myObject = new MyObject();
}

myObject.blah();

// some other stuff that I want synchronized
}

myObject 仅在同步块(synchronized block)中被触及。 lock 仅用于同步该 block 。

对吗?

所以稍微改写一下,我的问题是......假设有两个线程正在访问该代码。第一个线程锁定并设置 myObject,调用 .blah() 和同步块(synchronized block)中的任何其他代码,然后退出同步块(synchronized block)。这允许线程二进入同步块(synchronized block)。如果不将 myObject 设置为 volatile,它是否仍有可能将 myObject == null 评估为 true

最佳答案

synchronized block 将确保对内存的更新可以被其他线程看到。无需使 myObject 易变。

来自 Intrinsic Locks and Synchronization :

When a thread releases an intrinsic lock, a happens-before relationship is established between that action and any subsequent acquistion of the same lock.

关于java - 我应该同时使用 lock 和 volatile 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24355750/

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