我读过一些帖子和文章说我们不应该将java对象声明为易失性的,因为这样一来,只有引用变得易失性。这里有些例子:
link-1 https://stackoverflow.com/questions/15487544/declaring-an-object-as-volatile
link-2 https://wiki.sei.cmu.edu/confluence/display/java/CON50-J.+Do+not+assume+that+declaring+a+reference+volatile+guarantees+safe+publication+of+the+members+of+the+referenced+object
link-3 https://rules.sonarsource.com/java/RSPEC-3077
Sonar 的建议是“非原始字段不应该是“易失性”的”,然而,它也表明所描述的问题涉及可变对象。“类似地,将可变对象字段标记为易失性意味着对象引用是易失性的,但对象本身是易失性的。不是'。
我的问题是:将 java String 声明为 volatile 是否安全?
Because String
对象是不可变的,只有引用会被运算符修改,例如=
and +=
。因此,挥发性对于String
,因为它适用于参考本身。这也适用于其他不可变对象,就像它适用于基元一样。
澄清:
+=
即使在易失性上,它本身也不是线程安全的String
,因为它不是原子的,并且由读取和写入组成。如果有什么影响String
对象之间的读写,可能会导致意想不到的结果。虽然由此产生的String
仍然有效,它可能具有意想不到的价值。特别是,某些更改可能会“覆盖”其他更改。例如,如果您有一个String
与价值"Stack "
并且一个线程尝试追加"Overflow"
而另一个尝试附加"Exchange"
,有可能只应用一项更改。这也适用于基元。如果您有兴趣,可以找到有关此特定问题的更多详细信息(主要是在原语的上下文中)here https://stackoverflow.com/a/32676836/5781491.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)