查看此java代码段:
Lock l = ReentrantLock();
l.lock();
try {
counter++;
} finally {
l.unlock();
}
此代码保证只有一个线程会在特定时间内执行try块中的代码。
我的问题是:锁定/解锁机制如何保证线程之间的内存可见性?(是什么机制可以确保计数器结果将被线程X刷新到主内存中,并将通过后面会出现的线程Y从主内存加载?)
答案 0 :(得分:1)
http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.4.5
17.4.5。发生在订单之前
可以通过先发生关系来排序两个动作。如果一个动作发生在另一个动作之前,则第一个动作在第二个动作之前可见并且在第二个之前被命令。
...
从以上定义得出:
监视器上的解锁发生在每次后续锁定之前 监视。
...
在发生之前一致的一组操作中,每次读取都会看到一个写入,允许它通过发生前的顺序看到。
看到暗示是从另一个线程中看到。