我一直在阅读 Java 并发性,却忘记了使用相同锁的两个线程中的同步块也会影响变量的可见性,即使它们没有被定义为“易失性”。如果我有这样的代码
Object lock = new Object();
boolean a = false, b = false, c = false;
void threadOne() {
a = true;
synchronized(lock) {
b = true;
}
c = true;
}
void threadTwo() {
while (true) {
synchronized(lock) {
if (a && b && c) break;
}
}
}
...并且 threadOne 和 threadTwo 将被不同的线程调用:
是否保证代码会跳出while循环?
如果我们从方程中删除变量 c 怎么办?我想知道是否只有 b 保证在 threadTwo 中可见,因为它在同步块内。