【发布时间】:2014-04-28 11:28:54
【问题描述】:
我已阅读 SO 的以下文章
Difference between synchronization of field reads and volatile
这里提问者写道
同步的重点是保证 此线程读取的 acct.balance 是最新的,并且任何 对 acct.balance 中对象字段的未决写入也是 写入主存。
最受欢迎的答案:
你是对的。
请研究此代码:
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 ");
}
}
在我的电脑上,这个程序不会终止。
所以我认为
- 如果我更改 volatile 变量,我将在另一个线程中看到实际值 适合任何地方的杰出人士!
- 如果我用监视器“A”更改同步部分的变量,我会 仅在具有监视器“A”的同步部分中查看实际值(例如在另一个线程中)
我说的对吗?
【问题讨论】:
-
术语“主存储器”在这里是一个松散的术语。它只意味着一致的观点。 L2 缓存相互通信以实现这一点,因此更改甚至可能不在 L3 缓存中,更不用说主内存了。
-
@Peter Lawrey 我对 CPU 的了解不够。我什么都不懂
-
这将讨论缓存如何保持同步。 en.wikipedia.org/wiki/Cache_coherence 通常缓存相互通信,绕过主内存,因为缓存更快,设计。这将告诉你更多关于 CPU 缓存的知识en.wikipedia.org/wiki/CPU_cache
标签: java multithreading synchronization volatile thread-synchronization