2

在类ReentrantReadWriteLock中有以下奇怪的评论:

transient ThreadLocalHoldCounter readHolds;

Sync() {
    readHolds = new ThreadLocalHoldCounter();
    setState(getState()); // ensures visibility of readHolds
}

“确保可见性”是什么意思?我问的原因是我有一种情况,看起来好像线程本地 readHolds 正在被重置(线程本地被实现为 WeakReferences,因此只要包含的 Sync 对象仍然存在,就不应该发生这种情况)。setState/getState 只是简单地改变另一个实例变量并且不触及 readHolds。

4

1 回答 1

3

setState(int)方法执行对 volatile 变量的赋值。这会导致当前线程执行的任何分配(包括 readHolds)被刷新到“主内存”。

其他线程调用getState()读取这个相同的 volatile 变量。由于变量是易失的,线程的缓存首先被清除,迫使后续的读取操作到主内存,在那里他们会找到最近的值readHolds

于 2009-11-04T17:21:57.480 回答