【发布时间】:2018-02-15 19:21:19
【问题描述】:
假设我有
private volatile AtomicInteger atomInt = new AtomicInteger(3);
在方法中我的用法是atomInt.incrementAndGet()。
由于我使用的是AtomicInteger,所以会避免“线程干扰”。然后我使用 volatile,因此它将保证所有线程中变量的一致视图。这是否意味着我已经获得了完整的线程安全性,或者仍然存在“内存一致性问题”的可能性?
由于tutorial 中使用了“减少”,我感到困惑,所以这表明我仍有机会,但我想不到:
使用易失变量降低内存一致性的风险 错误,因为对 volatile 变量的任何写入都会建立 与后续读取相同的发生之前的关系 变量。
【问题讨论】:
-
您是否曾经重新分配
atomInt(如atomInt = ...)?如果不是,则使其成为最终的,而不是易变的。 volatile 是指变量的值,而不是在变量指向的东西中声明。 -
@AndyTurner 感谢您抽出宝贵时间回复。好的,我认为这样可以保证线程安全,对吧?但我仍在寻找我的问题的答案。
-
您的问题的答案是,如果您从不重新分配变量,则不需要使用 volatile,如果需要,您可能需要使用它。
-
同上@AndyTurner。将变量声明为
final,而不是volatile。如果您使用的是AtomicInteger变量,而您不能将其声明为final,那么您要么在做一些非常棘手的事情,要么更有可能是出了点问题。 -
Re,“这是否意味着我已经获得了完整的线程安全......?”完全线程安全是指保证您的多线程程序始终做正确的事情。你还没有向我们展示一个完整的程序,所以没有办法真正回答这个问题。线程安全是整个程序架构的一个属性。这不是你可以一次一行地赋予程序的东西。
标签: java multithreading atomic volatile