如何使 volatile count++ 操作成为线程安全的

2024-04-22

我一直在经历 JCIP,作者说..

线程限制的一个特殊情况适用于易失性变量。只要确保 volatable 变量仅从单个线程写入,对共享 volatile 变量执行读取-修改-写入操作是安全的

例如 count++ 被认为是一个复合操作(读取值、加一、更新值)并且将 count 声明为 volatile 并不会使该操作成为原子操作,因此这里不能保证线程安全!我对吗 ??但这里作者说,如果我们确保 volatile 变量仅从单个线程写入,我们就可以修复它。 我不明白这一点。请提供说明。


count++本质上是两个操作,读取count的值和存储count+1。

如果两个线程尝试同时执行 count++,它们可能都会读取 count 的旧值并将其加一。因此,最后,如果不添加任何同步机制,最终的值将是 count + 1,而不是 count + 2。

在这种情况下,Volatile 不保证线程安全(不是原子的),它只保证最近存储的值将可供所有线程使用。但这对于上述场景来说并没有多大帮助。您需要确保在存储新计数之前没有其他线程会读取旧计数值。

如果您需要线程安全的计数器,我建议您查看 AtomicInteger (和类似的)类。他们提供了 count++ 的原子版本; incrementAndGet 方法。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使 volatile count++ 操作成为线程安全的 的相关文章

随机推荐