不必要地使用 volatile 关键字——这很危险吗?
Unnecessarily using volatile keyword -- is that dangerous?
在 Java 中创建变量 "volatile" 如果它实际上不需要标记为 volatile 是否有任何危害? ...或者只是 "unnecessary" 正如我经常阅读的那样。
作为一个涉足多线程的人,但不是计算机科学家,我目前正在使用 "if in doubt, make it volatile."
它可能会对性能产生影响,但仅此而已。
可能还有另一种危险:您哄骗自己认为由于一切都是易变的,所以您的代码是线程安全的。事实并非如此,并且没有什么可以替代实际理解代码的线程含义。如果你这样做,你就不需要将事物标记为易失性 "just in case."
但对于您的直接问题:不,您永远不会采用功能正确的代码并通过违反变量来破坏它。
明显的影响是一些小的性能影响,因为编译器被禁止使用 certain optimizations。然而,更糟糕的影响是虚假的安全感。仅仅因为一个变量是易变的并不意味着用它做的所有事情现在都是线程安全的,除非对它的所有操作都是原子的(否则该变量的观察和变化之间可能会断开连接)。
仍然需要适当的同步块。您的方法存在固有缺陷。抱歉,要获得线程安全可没那么简单。
第三个问题是它使代码的真正目的更加模糊。如果所有变量都标记为 volatile 那么 reader 如何知道哪些真正依赖于 属性 而哪些不依赖?这种默默无闻在代码维护负担中造成了隐性成本,也称为“技术债务”。
在 Java 中创建变量 "volatile" 如果它实际上不需要标记为 volatile 是否有任何危害? ...或者只是 "unnecessary" 正如我经常阅读的那样。
作为一个涉足多线程的人,但不是计算机科学家,我目前正在使用 "if in doubt, make it volatile."
它可能会对性能产生影响,但仅此而已。
可能还有另一种危险:您哄骗自己认为由于一切都是易变的,所以您的代码是线程安全的。事实并非如此,并且没有什么可以替代实际理解代码的线程含义。如果你这样做,你就不需要将事物标记为易失性 "just in case."
但对于您的直接问题:不,您永远不会采用功能正确的代码并通过违反变量来破坏它。
明显的影响是一些小的性能影响,因为编译器被禁止使用 certain optimizations。然而,更糟糕的影响是虚假的安全感。仅仅因为一个变量是易变的并不意味着用它做的所有事情现在都是线程安全的,除非对它的所有操作都是原子的(否则该变量的观察和变化之间可能会断开连接)。
仍然需要适当的同步块。您的方法存在固有缺陷。抱歉,要获得线程安全可没那么简单。
第三个问题是它使代码的真正目的更加模糊。如果所有变量都标记为 volatile 那么 reader 如何知道哪些真正依赖于 属性 而哪些不依赖?这种默默无闻在代码维护负担中造成了隐性成本,也称为“技术债务”。