String s = "foobar" 是吗?原子?
String s = "foobar";
是原子的吗?
分配对象引用应该是,但我不太确定。
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
String s = "foobar";
是原子的吗?
分配对象引用应该是,但我不太确定。
谢谢。
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(3)
是。在java中所有的引用赋值都是原子的。
请注意,像 String s = new String("foobar") 这样的复合语句不是原子的,因为它包含对象创建和单独的赋值。
另请注意,“对 long 和 double 变量的赋值可能不是原子的”,来自 JLS-17.7
Yes. All reference assignments are atomic in java.
Just note that a composite statement like
String s = new String("foobar")
is not atomic, because it comprises of an object creation and then an assignment separately.Also note that "assignments to long and double variables may not be atomic", from JLS-17.7
这里已经给出了许多很好的答案。我仍然想要一些更“官方”的关于“所有引用分配在 java 中都是原子的”这样的声明,以及为什么
String s = "foobar"
不在运行时创建新对象。以下是 Java 语言规范 中的内容。 (缩写JLS)。下面是一些示例:
第 1 行和第 2 行是原子的,因为:
第 3 行是原子的,因为:
该行中只有一个引用赋值。
第 4 行不是原子,因为:
通过连接两个字符串变量,在运行时创建一个新的 String 对象。对象构造不是原子的。
第 5 行不是原子的,因为:
String 对象是在运行时在该行中构造的。
Many great answers have already been give here. Still I want something more "official" about claims like "All reference assignments are atomic in java", and why
String s = "foobar"
does not create a new object at runtime. Here is what is written in Java Language Spec. (Abbr. JLS).Below are some examples:
Line 1 and line 2 are atomic because:
Line 3 is atomic because:
There is only a reference assignment in this line.
Line 4 is not atomic because:
By concat two string variables, a new String object is created at runtime. Object construction is not atomic.
Line 5 is not atomic because:
A String object is constructed at runtime in this line.
是的,但如果您担心竞争条件,您至少应该注意“同步”方法/块。
请注意,这不是原子的,因为它包含两个操作:
Yes, but if you're worried about race conditions, you should at least be aware of 'synchronized' methods/blocks.
And note that this is not atomic because it contains two operations: