代码之家  ›  专栏  ›  技术社区  ›  Nerdy Bunz

不必要地使用volatile关键字-这有危险吗?

  •  4
  • Nerdy Bunz  · 技术社区  · 7 年前

    如果Java实际上不需要标记“易失性”变量,那么它是否有任何危害?……还是像我经常读到的那样“不必要”。

    作为一个涉足多线程的人,但不是一个计算机专家,我现在打算“如果有疑问,让它变得不稳定”。

    2 回复  |  直到 7 年前
        1
  •  7
  •   yshavit    7 年前

    它可以影响性能,但就是这样。

    可能还有另一个危险:你诱使自己去思考,既然一切都是不稳定的,你的代码是线程安全的。事实并非如此,而且没有替代方法可以真正理解代码的线程含义。如果你这样做了,你就不需要把事情的不稳定性标记为“以防万一”。

    但对于您的直接问题:不,您永远不会接受功能正确的代码,并通过使变量违反来破坏它。

        2
  •  11
  •   Patrick Parker    7 年前

    明显的影响是一些小的性能影响,因为编译器被禁止使用 certain optimizations .然而,更糟糕的影响是错误的安全感。仅仅因为一个变量是不稳定的,并不意味着用它所做的一切现在都是线程安全的,除非对它进行的所有操作都是原子操作(否则,在观察和该变量的突变之间可能会存在断开)。

    仍然需要适当的同步块。你的方法天生就有缺陷。抱歉,但是获得线程安全性并不是那么简单。

    第三个问题是它使代码的真正用途更加模糊。如果所有变量都标记为volatile,那么读者如何知道哪些变量真正依赖于该属性,哪些变量不依赖于该属性?这种默默无闻造成了代码维护负担中的隐藏成本,也称为技术债务。