在类里面ReentrantReadWriteLock以下是奇怪的评论:
transient ThreadLocalHoldCounter readHolds;
Sync() {
readHolds = new ThreadLocalHoldCounter();
setState(getState()); // ensures visibility of readHolds
}
“确保可见性”是什么意思?我问的原因是我遇到了一种情况,看起来线程本地 readHolds 正在被重置(线程本地被实现为 WeakReferences,因此只要包含的 Sync 对象仍然存在,就不会发生这种情况)。 setState/getState 只是更改另一个实例变量,而不触及 readHolds。
最佳答案
setState(int)
方法执行对 volatile 变量的赋值。这会导致当前线程执行的任何分配(包括 readHolds)被刷新到“主内存”。
调用getState()
的其他线程读取同一个 volatile 变量。由于该变量是 volatile 的,因此首先清除线程的缓存,迫使后续读取操作转到主内存,在那里它们将找到 readHolds
的最新值。
关于Java实例变量可见性(ThreadLocal),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1675268/