【发布时间】:2018-12-02 23:40:59
【问题描述】:
如果实际上不需要将变量标记为 volatile,那么在 Java 中将变量设置为“volatile”有什么害处吗? ... 还是我经常读到的“不必要”。
作为一个涉足多线程的人,但不是计算机科学家,我目前的想法是“如果有疑问,就让它变得易变”。
【问题讨论】:
标签: java android multithreading concurrency volatile
如果实际上不需要将变量标记为 volatile,那么在 Java 中将变量设置为“volatile”有什么害处吗? ... 还是我经常读到的“不必要”。
作为一个涉足多线程的人,但不是计算机科学家,我目前的想法是“如果有疑问,就让它变得易变”。
【问题讨论】:
标签: java android multithreading concurrency volatile
明显的影响是一些小的性能影响,因为编译器被禁止使用certain optimizations。然而,更糟糕的影响是错误的安全感。仅仅因为一个变量是 volatile 并不意味着用它完成的所有事情现在都是线程安全的,除非对它的所有操作都是原子的(否则观察和该变量的突变之间可能存在脱节)。
仍然需要适当的同步块。你的方法本质上是有缺陷的。抱歉,要获得线程安全并不是那么简单。
第三个问题是它使您的代码的真正目的更加模糊。如果所有变量都标记为 volatile,那么读者如何知道哪些变量真正依赖该属性而哪些不依赖?这种模糊性会在代码维护负担中产生隐藏成本,也称为“技术债务”。
【讨论】:
它可能会影响性能,但仅此而已。
可能还有另一个危险:你让自己误以为因为一切都是易变的,所以你的代码是线程安全的。事实并非如此,并且没有什么可以替代实际理解代码的线程含义。如果你这样做了,你就不需要“以防万一”标记事物。
但是对于您的直接问题:不,您永远不会采用功能正确的代码并通过违反变量来破坏它。
【讨论】: