java示例变量可见性(threadlocal)

zyfwsgd6  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(495)

在reentrantreadwritelock类中有以下奇怪的注解:

transient ThreadLocalHoldCounter readHolds;

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

“确保可见性”是什么意思?我问这个问题的原因是,我遇到了这样一种情况:线程本地readholds似乎正在被重置(线程本地被实现为weakreference,所以只要包含sync对象仍然活动,就不应该发生这种情况)。setstate/getstate只是改变另一个示例变量,而不涉及readholds。

cclgggtu

cclgggtu1#

这个 setState(int) 方法执行对可变变量的赋值。这会导致当前线程执行的任何分配(包括readholds)被刷新到“主内存”。
其他线程调用 getState() 读取相同的可变变量。由于变量是易失性的,线程的缓存首先被清除,迫使后续的读操作转到主内存,在主内存中它们将找到 readHolds .

相关问题