java - 将字符串类型引用标记为 volatile 安全吗?

标签 java string immutability volatile

我读过一些帖子和文章,说我们不应该将 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/

相关文章:

c++ - 为什么函数返回一个空字符串

java - 如何在java中对具有多个数据排序的对象列表进行排序

java - 在 Java8 中使用 lambda 排序和创建映射

java - 如何调用字符串数组中的 Java 方法? (java.lang.NoSuchMethodException)

arrays - react : Update element of array without rerendering other array elements

c# - 在 C# 中实现本地运行时不变性

scala - 逆变和 val

java - TAB 布局宽度

java - 构建错误 : missing artifact com. sun :tools:jar:1. 6

c++ - 删除额外的括号