gpt4 book ai didi

java - 字段读取同步和 volatile 之间的可见性差异

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:05 27 4
gpt4 key购买 nike

我已阅读 SO 的以下文章

Difference between synchronization of field reads and volatile

这里提问者写道

the point of the synchronization is to ensure that the value of acct.balance that are read by this thread is current and that any pending writes to the fields of the object in acct.balance are also written to main memory.

最受欢迎的答案:

You are correct.

请研究这段代码:

public class VolatileTest {

static/* volatile */boolean done = false;

public VolatileTest() {
synchronized (this) {

}

}

public static void main(String[] args) throws Exception {
Runnable waiter = new Runnable() {
public void run() {
while (!done)
;
System.out.println("Exited loop");

}
};
new Thread(waiter).start();
Thread.sleep(100); // wait for JIT compilation
synchronized (VolatileTest.class) {
done = true;
}
System.out.println("done is true ");
}

}

在我的电脑上这个程序不会终止。

所以我认为

  1. 如果我更改 volatile 变量,我将在另一个线程中看到实际值无处不在的优秀!
  2. 如果我用监视器“A”改变同步部分的变量,我会仅在与监视器“A”同步的部分中查看实际值(例如在另一个线程中)

我说得对吗?

最佳答案

  1. 是的,这是真的,因为 volatile write happens-before 写入的值可以从变量中读取。
  2. 不完全是。可以保证同一监视器上的另一个同步线程将看到更新后的值,因为监视器释放发生在同一监视器被另一个线程获取。如果不获取相同的监视器,其他线程可能会看到更新后的值。你公式中的“唯一”太强了:)

关于java - 字段读取同步和 volatile 之间的可见性差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23339903/

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