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

Java字符串实例化和赋值原子性,java,multithreading,atomic,Java,Multithreading,Atomic,这是有关的。我对那里的答案有点困惑。。。作业是原子的,没关系。但如果我们有 String s = "s"; 执行这一行的步骤不是很简单吗 1-将新字符串实例的位置分配给引用s(这样,即使新字符串的构造函数尚未运行,其实际上也不为null) 2-运行构造函数 所以,这个任务唯一应该原子化的时间是“s”是否被拘留 这不正是读取部分构造对象的方式吗 不是重复-我的问题不是任务是否是原子的。我的问题是,如果“s”尚未实习(在派遣时实际上不存在),如果可能的话,该怎么办。是的,它是一种原子操作。 也许这

这是有关的。我对那里的答案有点困惑。。。作业是原子的,没关系。但如果我们有

String s = "s";
执行这一行的步骤不是很简单吗 1-将新字符串实例的位置分配给引用s(这样,即使新字符串的构造函数尚未运行,其实际上也不为null) 2-运行构造函数

所以,这个任务唯一应该原子化的时间是“s”是否被拘留

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


不是重复-我的问题不是任务是否是原子的。我的问题是,如果“s”尚未实习(在派遣时实际上不存在),如果可能的话,该怎么办。

是的,它是一种原子操作。 也许这会有帮助():

String类型的编译时常量表达式总是“interned”,以便使用String.intern方法共享唯一实例

此外,字符串文字总是引用类字符串的同一实例。这是因为字符串文字(或者更一般地说,是常量表达式(§15.28)的值的字符串)被“插入”,以便使用string.intern方法共享唯一实例


因此,我不确定这里是否调用了字符串构造函数。

在程序的所有其他操作之前,像
1
“s”
这样的常量存在。这个问题与您链接到的问题如何不同?基本上是因为我不询问赋值是否是原子的,我在问为什么字符串和任何其他对象有什么不同。你从哪里知道值是在构造函数运行之前赋值的?赋值是原子的原因之一是因为构造函数是在赋值之前运行的。对象必须存在于内存中,才能对其进行引用。这不是
字符串所独有的。此外,在您的示例中没有调用构造函数。正如ACV所提到的,
“s”
对象已经存在。