String s = “foobar” 是原子的吗?
是原子的吗?String s = "foobar";
分配一个对象引用应该是,但我真的不确定。
谢谢。
是原子的吗?String s = "foobar";
分配一个对象引用应该是,但我真的不确定。
谢谢。
是的。所有引用赋值在 java 中都是原子的。
请注意,像这样的复合语句不是原子的,因为它包括一个对象创建,然后分别一个赋值。String s = new String("foobar")
另请注意,“对长变量和双精度变量的赋值可能不是原子的”,来自 JLS-17.7
这里已经给出了许多很好的答案。我仍然想要一些关于“所有引用赋值在java中都是原子的”之类的声明的更“官方”的东西,以及为什么不在运行时创建新对象。这是用 Java 语言规范编写的。(缩写JLS)。String s = "foobar"
以下是一些示例:
String str1 = "foo"; // line 1, atomic
String str2 = "foo" + "bar"; // line 2, atomic
String str3 = str1; // line 3, atomic
String str4 = str1 + str2; // line 4, not atomic
String str5 = new String("foobar"); // line 5, not atomic
第 1 行和第 2 行是原子的,因为:
JLS - 15.28:常量表达式是表示基元类型的值或字符串的表达式,该值不会突然完成,并且使用...基元类型的文本和字符串类型的文本。
JSL - 3.10.5:由常量表达式 (§15.28) 计算的字符串在编译时计算,然后被视为文本。
JLS - 17.7:写入和读取引用始终是原子的,无论它们是作为 32 位还是 64 位值实现的。
第 3 行是原子的,因为:
此行中只有一个引用赋值。
JLS - 17.7
第 4 行不是原子的,因为:
通过连接两个字符串变量,将在运行时创建一个新的 String 对象。对象构造不是原子的。
JLS - 15.8.1 - 字符串串联运算符 +:String 对象是新创建的 (§12.5),除非表达式是常量表达式 (§15.28)。
JLS - 3.10.5 - 字符串文本:在运行时通过串联计算的字符串是新创建的,因此是不同的。
第 5 行不是原子的,因为:
String 对象是在运行时在此行中构造的。