Java实例变量可见性(ThreadLocal)

发布于 2024-08-09 19:09:37 字数 527 浏览 9 评论 0原文

在类中 ReentrantReadWriteLock 是以下好奇的评论:

transient ThreadLocalHoldCounter readHolds;

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

“确保可见性”是什么意思?我问的原因是我遇到了一种情况,看起来线程本地 readHolds 正在被重置(线程本地被实现为 WeakReferences,因此只要包含的 Sync 对象仍然存在,就不会发生这种情况)。 setState/getState 只是更改另一个实例变量并且不触及 readHolds。

In the class ReentrantReadWriteLock is the following curious comment:

transient ThreadLocalHoldCounter readHolds;

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

what does it mean by "ensures visibility"? The reason I ask is that I have a situation where it looks as though the thread local readHolds is being reset (thread locals are implemented as WeakReferences so that shouldn't happen as long as the containing Sync object is still alive). setState/getState simply alter another instance variable and don't touch readHolds.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

残月升风 2024-08-16 19:09:37

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

其他调用 getState() 的线程读取这个相同的易失性变量。由于变量是易失性的,因此线程的缓存首先被清除,强制后续的读取操作转到主内存,在那里它们将找到 readHolds 的最新值。

The setState(int) method performs an assignment to a volatile variable. This causes any assignments performed by the current thread—including readHolds—to be flushed to "main memory".

Other threads calling getState() read this same volatile variable. Since the variable is volatile, the thread's cache is cleared first, forcing subsequent read operations to go out to main memory, where they will find the most recent value of readHolds.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文