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

时间:2018-06-23 23:26:15

标签: java android multithreading concurrency volatile

如果实际上不需要将变量标记为volatile,那么在Java中将其变为“ volatile”是否有任何危害? ...还是我经常读到的只是“不必要”。

作为涉足多线程技术的人,但又不是计算机高手,我目前正在考虑“如有疑问,请使其易变”。

2 个答案:

答案 0 :(得分:11)

显而易见的影响是对性能的影响很小,因为禁止编译器使用certain optimizations。但是,更严重的影响是错误的安全感。仅仅因为变量是易失性的,并不意味着它所完成的一切现在都是线程安全的,除非对其进行的所有操作都是原子的(否则观察和该变量的变异之间可能会脱节)。

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

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

答案 1 :(得分:7)

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

还有另一种危险:您会让自己陷入沉思,因为一切都是易变的,因此您的代码是线程安全的。事实并非如此,并且没有替代品可以真正理解代码的线程含义。如果这样做,则无需“以防万一”将事物标记为易失性。

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