Kon*_*rus 11 java multithreading java-memory-model
假设有一个这样的类:
public void MyClass {
private boolean someoneTouchedMeWhenIWasWorking;
public void process() {
someoneTouchedMeWhenIWasWorking = false;
doStuff();
synchronized(this) {
if (someoneTouchedMeWhenIWasWorking) {
System.out.println("Hey!");
}
}
}
synchronized public void touch() {
someoneTouchedMeWhenIWasWorking = true;
}
}
Run Code Online (Sandbox Code Playgroud)
一个线程调用process,另一个调用touch.注意process启动时如何在没有同步的情况下清除标志.
使用Java内存模型,运行的线程是否有可能process看到其本地,非同步写入的效果,即使touch稍后发生?
也就是说,如果线程按此顺序执行:
T1: someoneTouchedMeWhenIWasWorking = false; // Unsynchronized
T2: someoneTouchedMeWhenIWasWorking = true; // Synchronized
T1: if (someoneTouchedMeWhenIWasWorking) // Synchronized
Run Code Online (Sandbox Code Playgroud)
... T1是否有可能从本地缓存中看到值?它可以首先刷新它对内存的所有内容(覆盖T2编写的内容),并从内存中重新加载该值吗?
是否有必要同步第一次写入或使变量变为volatile?
如果答案得到文档或一些可敬的消息来源的支持,我将非常感激.
process() 中的同步块确保从主内存中获取最新值。因此,代码本身是安全的。
这是 volatile 变量的一个很好的用例。“someoneTouchedMeWhenIWasWorking”至少应该是可变的。
在您的示例代码中,synchronized 用于保护“someoneTouchedMeWhenIWasWorking”,它只不过是一个标志。如果它被设为易失性,则可以删除“同步”块/方法。
| 归档时间: |
|
| 查看次数: |
400 次 |
| 最近记录: |