【问题标题】:Unnecessarily using volatile keyword -- is that dangerous?不必要地使用 volatile 关键字——这很危险吗?
【发布时间】:2018-12-02 23:40:59
【问题描述】:

如果实际上不需要将变量标记为 volatile,那么在 Java 中将变量设置为“volatile”有什么害处吗? ... 还是我经常读到的“不必要”。

作为一个涉足多线程的人,但不是计算机科学家,我目前的想法是“如果有疑问,就让它变得易变”。

【问题讨论】:

    标签: java android multithreading concurrency volatile


    【解决方案1】:

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

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

    第三个问题是它使您的代码的真正目的更加模糊。如果所有变量都标记为 volatile,那么读者如何知道哪些变量真正依赖该属性而哪些不依赖?这种模糊性会在代码维护负担中产生隐藏成本,也称为“技术债务”。

    【讨论】:

      【解决方案2】:

      它可能会影响性能,但仅此而已。

      可能还有另一个危险:你让自己误以为因为一切都是易变的,所以你的代码是线程安全的。事实并非如此,并且没有什么可以替代实际理解代码的线程含义。如果你这样做了,你就不需要“以防万一”标记事物。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-27
        • 2011-04-20
        • 1970-01-01
        • 1970-01-01
        • 2018-10-17
        • 2014-01-27
        相关资源
        最近更新 更多