Java实例变量可见性(ThreadLocal)

时间:2009-11-04 17:09:52

标签: java garbage-collection visibility thread-local

在班级ReentrantReadWriteLock中有以下好奇的评论:

transient ThreadLocalHoldCounter readHolds;

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

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

1 个答案:

答案 0 :(得分:3)

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

调用getState()的其他线程读取同一个volatile变量。由于变量是易失性的,因此首先清除线程的缓存,迫使后续的读取操作进入主存储器,在那里他们将找到最新的readHolds值。