滥用volatile关键字--是否危险?

4

如果一个变量在Java中不需要被标记为volatile,那么把它标记为volatile会有什么危害吗?或者像我经常听到的那样,只是“不必要”的。

作为一个涉猎多线程编程但并非专业计算机科学家的人,我目前的做法是“如果有疑问,就将其标记为volatile”。

2个回答

11
明显的影响是一些小的性能影响,因为编译器被禁止使用某些优化。然而更糟糕的影响是虚假的安全感。仅仅因为一个变量是易失性的,并不意味着对它进行的所有操作都是线程安全的,除非所有对它的操作都是原子的(否则可能存在观察和修改该变量之间的断开)。需要适当的同步块。您的方法本质上是有缺陷的。抱歉,要实现线程安全并不简单。第三个问题是它使代码的真实目的更加模糊。如果所有变量都标记为易失性,那么读者如何知道哪些变量真正依赖于该属性,哪些不依赖?这种模糊性会在代码维护负担中产生隐藏的成本,也称为“技术债务”。

7

这可能会对性能产生影响,但仅限于此。

另一个危险可能在于你让自己误以为由于所有东西都是易失性的,所以你的代码是线程安全的。事实并非如此,而了解代码的线程处理影响是没有替代品的。如果你这样做了,你就不需要“以防万一”地将变量标记为volatile。

但对于您目前的问题:不,您不会通过使变量无效来破坏功能上正确的代码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接