String s ="foobar"原子?

mel*_*bic 16 java atomic

String s = "foobar";原子?

应该分配一个对象引用,但我不是很确定.

谢谢.

Sur*_*ran 19

是的.所有引用分配在java中都是原子的.

请注意,复合语句String s = new String("foobar")不是原子的,因为它包含一个对象创建,然后分别包含一个赋值.

另请注意,JLS-17.7中的 "长变量和双变量的赋值可能不是原子的"

  • 还应该注意,对`long`和`double`变量的赋值是*not*atomic:参见[JLS chapter 17.7](http://java.sun.com/docs/books/jls/third_edition/html/memory .html#17.7)了解更多信息. (3认同)

Lyu*_*yux 6

这里已经给出了许多很好的答案。我仍然想要一些关于“所有引用分配在java中都是原子的”这样的声明的更“官方”的内容,以及为什么String s = "foobar"不在运行时创建一个新对象。这是Java Language Spec中的内容。(缩写JLS)。

\n

以下是一些示例:

\n
String 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\n
Run Code Online (Sandbox Code Playgroud)\n

第 1 行和第 2 行是原子的,因为:

\n
    \n
  1. 它们都是常量表达式,并且在编译时计算。运行时没有发生对象构造。
  2. \n
\n
\n

JLS - 15.28:常量表达式是表示基本类型的值或不会突然完成的字符串的表达式,并且使用...基本类型的文字和字符串类型的文字组成。

\n
\n
\n

JSL - 3.10.5:由常量表达式 (\xc2\xa715.28) 计算的字符串在编译时计算,然后将其视为文字。

\n
\n
    \n
  1. 写入和读取引用始终是原子的。
  2. \n
\n
\n

JLS - 17.7:对引用的写入和读取始终是原子的,无论它们是实现为 32 位还是 64 位值。

\n
\n

第 3 行是原子的,因为:

\n

这一行中只有一个参考作业。

\n
\n

JLS-17.7

\n
\n

第 4 行不是原子的,因为:

\n

通过连接两个字符串变量,在运行时创建一个新的 String 对象。对象构造不是原子的。

\n
\n

JLS - 15.8.1 - 字符串连接运算符 +:除非表达式是常量表达式 (\xc2\xa715.28),否则新创建 String 对象 (\xc2\xa712.5)。

\n
\n
\n

JLS - 3.10.5 - 字符串文字:在运行时通过连接计算的字符串是新创建的,因此是不同的。

\n
\n

第 5 行不是原子的,因为:

\n

String 对象是在运行时在这一行中构造的。

\n