Java实例变量可见性(ThreadLocal)

Java实例变量可见性(ThreadLocal),java,garbage-collection,visibility,thread-local,Java,Garbage Collection,Visibility,Thread Local,课堂上有以下奇怪的评论: transient ThreadLocalHoldCounter readHolds; Sync() { readHolds = new ThreadLocalHoldCounter(); setState(getState()); // ensures visibility of readHolds } “确保可见性”是什么意思?我问这个问题的原因是,我遇到了这样一种情况:线程本地readhold看起来好像正在被重置(线程本地变量被实现为weakr

课堂上有以下奇怪的评论:

transient ThreadLocalHoldCounter readHolds;

Sync() {
    readHolds = new ThreadLocalHoldCounter();
    setState(getState()); // ensures visibility of readHolds
}
“确保可见性”是什么意思?我问这个问题的原因是,我遇到了这样一种情况:线程本地readhold看起来好像正在被重置(线程本地变量被实现为weakreference,因此只要包含的Sync对象仍然处于活动状态,就不应该发生这种情况)。setState/getState只需更改另一个实例变量,而不触及readHolds。

方法执行对易失性变量的赋值。这会导致当前线程执行的任何分配(包括readhold)被刷新到“主存”

调用
getState()
的其他线程读取相同的易失性变量。由于变量是易变的,线程的缓存首先被清除,迫使后续的读取操作进入主存,在主存中,它们将找到
readHolds

的最新值。您可以显示setState()/getState()?这里有一个示例:“当前线程执行的任何分配,包括readHolds-”你脸红了。其他写入是否写入到易失性变量并不重要;如果它们出现在源代码中对volatile变量的写入之前,它们将与volatile变量一起刷新。这是Java5中对Java内存模型的关键更改之一。