Java 字符串实例化和赋值原子性

Java String instantiation and assignment atomicity

这与 Is String s = "foobar" atomic? 有关。我对那里的答案有点困惑......分配是原子的,没关系。但是如果我们有

String s = "s";

执行这一行的步骤是不是 1 - 将新 String 实例的位置分配给引用 s(因此它实际上不为空,即使新 String 的构造函数尚未 运行) 2 - 运行 构造函数?

所以,只有当 "s" 被 interned 时,这个分配才会自动发生?

这不正是读取部分构造的对象的方式吗?

不是重复的 - 我的问题不是赋值是否是原子的。我的问题是,如果 "s" 尚未被拘留(在分配时实际上不存在)并且可能的话怎么办。

是的,这是一个原子操作。 也许这会有所帮助 (JLS):

Compile-time constant expressions of type String are always "interned" so as to share unique instances, using the method String.intern.

Moreover, a string literal always refers to the same instance of class String. This is because string literals - or, more generally, strings that are the values of constant expressions (§15.28) - are "interned" so as to share unique instances, using the method String.intern.

所以我不确定这里调用了 String 构造函数。