Java实例变量可见性(ThreadLocal)

标签 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。

最佳答案

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

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

关于Java实例变量可见性(ThreadLocal),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1675268/

相关文章:

java - ftp 从 windows 发送到 linux 显示 java.net.ConnectException

java - 为什么让短期和长期对象在垃圾收集中有所不同?

java - Java 中同步的可见性影响

java - TinyOS:RssiDemo

java - JSF 应用程序的 Web 服务

java - GC_CONCURRENT不停运行

javafx-2 - 如何限制项目的可见性?

java - SecurityContext#setAuthentication 是否保证可见性?

java - 通过java检查我的服务器是否启动

java - 仅通过使 head = null 删除单个链表?