在reentrantreadwritelock类中有以下奇怪的注解:
transient ThreadLocalHoldCounter readHolds;
Sync() {
readHolds = new ThreadLocalHoldCounter();
setState(getState()); // ensures visibility of readHolds
}
“确保可见性”是什么意思?我问这个问题的原因是,我遇到了这样一种情况:线程本地readholds似乎正在被重置(线程本地被实现为weakreference,所以只要包含sync对象仍然活动,就不应该发生这种情况)。setstate/getstate只是改变另一个示例变量,而不涉及readholds。
1条答案
按热度按时间cclgggtu1#
这个
setState(int)
方法执行对可变变量的赋值。这会导致当前线程执行的任何分配(包括readholds)被刷新到“主内存”。其他线程调用
getState()
读取相同的可变变量。由于变量是易失性的,线程的缓存首先被清除,迫使后续的读操作转到主内存,在主内存中它们将找到readHolds
.