2009-11-04 40 views
2

在类ReentrantReadWriteLock在下面的好奇评论:Java实例变量的可见性(ThreadLocal的)

transient ThreadLocalHoldCounter readHolds; 

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

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

+0

你可以显示setState()/ getState()吗? – notnoop

+0

这里有一个例子:http://fuseyism.com/classpath/doc/java/util/concurrent/locks/AbstractQueuedSynchronizer-source.html –

回答

3

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

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

+1

“*由当前线程执行的任何*赋值(包括readHolds-)被刷新。其他写入是否为volatile变量无关紧要;如果它们在写入源代码中的volatile变量之前出现,它们将与volatile变量一起刷新。这是Java 5中发生的Java内存模型的主要变化之一。 – erickson