我读过一些帖子和文章,说我们不应该将 java 对象声明为 volatile,因为结果,只有引用变为 volatile。这里有些例子:
link-1
link-2
link-3
Sonar 的建议是“非原始字段不应该是“易失的””,但是,它也表明所描述的问题是指可变对象“同样,将可变对象字段标记为 volatile 意味着对象引用是易失的,但对象本身是不是'。
我的问题是:将 java String 声明为 volatile 是否安全?
最佳答案
因为String
对象是不可变的,只有引用被 =
等运算符修改和 +=
.因此,volatile 对于 String
是安全的,因为它适用于引用本身。这也适用于其他不可变对象(immutable对象),就像它适用于原语一样。
澄清:+=
即使在 volatile String
上,它本身也不是线程安全的,因为它不是原子的,并且由一个读取和一个写入组成。如果有什么影响 String
对象之间的读写,可能会导致意想不到的结果。而结果 String
仍然有效,它可能有一个意想不到的值。特别是,某些更改可能会“覆盖”其他更改。例如,如果您有 String
值为 "Stack "
并且一个线程试图追加 "Overflow"
而另一个尝试追加 "Exchange"
, 有可能只应用一个更改。这也适用于原语。如果您有兴趣,可以在 here 中找到有关此特定问题的更多详细信息(主要是在原语的上下文中)。 .
关于java - 将字符串类型引用标记为 volatile 安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61628641/