Sur*_*ran 19
是的.所有引用分配在java中都是原子的.
请注意,复合语句String s = new String("foobar")不是原子的,因为它包含一个对象创建,然后分别包含一个赋值.
另请注意,JLS-17.7中的 "长变量和双变量的赋值可能不是原子的"
这里已经给出了许多很好的答案。我仍然想要一些关于“所有引用分配在java中都是原子的”这样的声明的更“官方”的内容,以及为什么String s = "foobar"不在运行时创建一个新对象。这是Java Language Spec中的内容。(缩写JLS)。
以下是一些示例:
\nString str1 = "foo"; // line 1, atomic\nString str2 = "foo" + "bar"; // line 2, atomic\nString str3 = str1; // line 3, atomic\nString str4 = str1 + str2; // line 4, not atomic\nString str5 = new String("foobar"); // line 5, not atomic\nRun Code Online (Sandbox Code Playgroud)\n第 1 行和第 2 行是原子的,因为:
\n\n\nJLS - 15.28:常量表达式是表示基本类型的值或不会突然完成的字符串的表达式,并且使用...基本类型的文字和字符串类型的文字组成。
\n
\n\nJSL - 3.10.5:由常量表达式 (\xc2\xa715.28) 计算的字符串在编译时计算,然后将其视为文字。
\n
\n\nJLS - 17.7:对引用的写入和读取始终是原子的,无论它们是实现为 32 位还是 64 位值。
\n
第 3 行是原子的,因为:
\n这一行中只有一个参考作业。
\n\n\nJLS-17.7
\n
第 4 行不是原子的,因为:
\n通过连接两个字符串变量,在运行时创建一个新的 String 对象。对象构造不是原子的。
\n\n\nJLS - 15.8.1 - 字符串连接运算符 +:除非表达式是常量表达式 (\xc2\xa715.28),否则新创建 String 对象 (\xc2\xa712.5)。
\n
\n\nJLS - 3.10.5 - 字符串文字:在运行时通过连接计算的字符串是新创建的,因此是不同的。
\n
第 5 行不是原子的,因为:
\nString 对象是在运行时在这一行中构造的。
\n| 归档时间: |
|
| 查看次数: |
3695 次 |
| 最近记录: |