在班级ReentrantReadWriteLock中有以下好奇的评论:
transient ThreadLocalHoldCounter readHolds;
Sync() {
readHolds = new ThreadLocalHoldCounter();
setState(getState()); // ensures visibility of readHolds
}
“确保可见性”是什么意思?我问的原因是我的情况看起来好像线程本地readHolds正在被重置(线程本地实现为WeakReferences,所以只要包含的Sync对象仍然存在就不应该发生)。 setState / getState只是改变另一个实例变量,不要触及readHolds。
答案 0 :(得分:3)
setState(int)
方法执行对volatile变量的赋值。这会导致当前线程(包括readHolds)执行的任何分配被刷新到“主存储器”。
调用getState()
的其他线程读取同一个volatile变量。由于变量是易失性的,因此首先清除线程的缓存,迫使后续的读取操作进入主存储器,在那里他们将找到最新的readHolds
值。