考虑以下表示完成两项不同任务的共享标志:
volatile boolean completed1 = false;
volatile boolean completed2 = false;现在考虑两个线程:
第1条:
completed1 = true;
if (completed1 && completed2) continueSomeOtherStuff();第2条:
completed2 = true;
if (completed1 && completed2) continueSomeOtherStuff();continueSomeOtherStuff()至少会被可靠地调用一次吗?
更新:
它在happens-before在http://www.cs.umd.edu/~pugh/java/memoryModel/jsr133.pdf中的定义中找到:
在最后一句中没有提到线程关系,所以我假设它在所有线程中都是有效的。
发布于 2016-12-04 10:16:16
首先,代码可以简化如下:
No1:
completed1 = true;
if (completed2) continueSomeOtherStuff();No2:
completed2 = true;
if (completed1) continueSomeOtherStuff();不改变行为,因为删除的变量只由修改它们的线程读取,所以它们总是正确的。
由于您已经将变量声明为volatile,Java模型保证每个线程立即“看到”其他线程的修改。这意味着所有缓存都必须失效,JVM编译器不允许对这些变量重新排序或优化读取。
因此,在您的示例中,可以保证在continueSomeOtherStuff()方法中至少调用一次。它也可以被调用两次,在罕见的情况下,这两个线程都在两个线程评估条件之前执行了它们的第一个赋值。
https://stackoverflow.com/questions/40940318
复制相似问题