Java变量本身是线程安全的吗?更新变量时?

Java变量本身是线程安全的吗?更新变量时?,第1张

Java变量本身是线程安全的吗?更新变量时?

这取决于变量的类型。

double
s和
long
s(Java中的两种64位类型)如果不是
volatile
,则允许字眼翻译,而所有其他类型(包括引用)可能永远不会撕裂。单词撕裂会给您带来您担心的行为:某些字节来自旧值,某些字节来自新值,并且总体结果是一个既不是旧值也不是新值的值。

这在JLS17.7中指定:

出于Java编程语言内存模型的目的,对非易失性long或double值的单次写入被视为两次单独的写入:一次写入每个32位的一半。这可能导致线程从一次写入中看到64位值的前32位,而从另一次写入中看到后32位的情况。

易失的long和double值的写入和读取始终是原子的。

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

当然,引入数据竞争会带来很多问题。但是您的问题专门针对单词撕裂,因此,我只在这里解决这个问题,只是要注意“仅仅因为您可以,并不意味着您应该这样做”。您应该小心分析每个数据竞争,并
证明 它是良性的(就像其中的一些竞争一样,例如String.hashCode对其值的缓存)。



欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5431003.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-11
下一篇 2022-12-11

发表评论

登录后才能评论

评论列表(0条)

保存