当前位置: 首页 > 面试题库 >

Java原子在32位计算机上是64位分配吗?

贡威
2023-03-14
问题内容

如果我有这样的代码-

long x;
x  = 0xFFFFFFFFL;

如果我在32位计算机上运行此代码,是否保证它是原子的,或者是否有可能不同的线程读取x,可能会得到不完整/垃圾值?


问题答案:

这是简短的摘要:

  • 对于参考,读/写 总是 原子的(即使在64位实现中也是如此!)
  • 对于intcharbyteshortbooleanfloat,读/写操作 总是 原子
  • 对于doublelong,如果它们是volatile,则读/写 总是 原子的

因此,只有在读/写可能不是原子的情况下例外:

  • 对于doublelong,如果他们 申报volatile,他们 不能保证 是原子

所以,只要读原子/写入共享数据而言,你只需要做出volatile的任何doublelong。不管实际实现中使用了多少位,其他所有内容都已经保证是原子性的。

关于规格

这里是相关部分,此处转载以供快速参考:

[的JLS

17.7非原子处理doublelong](http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7)

一些实现可能会发现将64位longdouble值的单个写操作分为相邻32位值的两个写操作很方便。为了提高效率,此行为是特定于实现的;Java虚拟机可以自由地执行原子和两部分的写入longdouble值。

出于Java编程语言内存模型的目的,一次对non- volatile longdoublevalue的写操作被视为两次单独的写操作:一个写给每个32位的一半。这可能导致线程从一次写入中看到64位值的前32位,而从另一次写入中看到后32位的情况。写和读的volatile longdouble值始终原子。引用的写入和读取始终是原子的,无论它们是实现为32位还是64位值。

鼓励VM实现者避免在可能的情况下拆分其64位值。鼓励程序员将共享的64位值声明为volatile或正确同步其程序,以避免可能的复杂性。

也可以看看

  • JLS 17.6单词撕裂 -保证例如a byte可以在没有邻居干扰的情况下进行更新
  • JLS 8.3.1.4 volatile字段
  • Java教程/基本类/并发/原子变量
    • 需要注意的是给予int i;i++不是 原子!


 类似资料:
  • 问题内容: 我想知道x86和x64中的64位长吗? 问题答案: 是。Java 在任何JVM上都是64位,无一例外。所有Java原语类型都是完全可移植的,并且在所有实现中都具有固定的大小。

  • 问题内容: 在64位计算机上,Java中的int大小是32位还是64位? 问题答案: 32位。这是Java语言的功能之一,整数的大小不会随基础计算机而变化。请参阅规范的相关部分。

  • 我有个奇怪的MSI!!!

  • 问题内容: 因此,标题中的问题是,我需要在32位Windows XP的系统上的Tomcat中运行我的服务器应用程序,我正在Eclipse的64位Windows 7上工作和编译。如何将其编译为32位,我需要做什么?我假设在64位计算机上编译它时,它不能在32位Windows上运行? 问题答案: Java不会构建32位或64位应用程序-字节码可在不同的位体系结构之间移植。 唯一的例外是您可能在代码中使

  • 为了使用SharePoint对象模型,我在安装在32位计算机和32位操作系统上的Windows服务中使用SharePoint 64位 dll。 64位dll可能在32位计算机上工作吗? 在什么情况下我们会面临“64位dll在32位机器上无法工作”的问题? 如果我想在64位和32位计算机上安装相同的解决方案,该怎么办?我不想每次都更改目标平台。 更新: 经过研发,我发现“32位解决方案可以安装在64

  • 问题内容: 我的电脑正在使用Windows 7 64位。但是将要部署我的jsp Web应用程序的服务器是32位。 我需要在PC上安装32位JDK / JRE才能进行开发吗?我正在使用Eclipse。 非常感谢你。 问题答案: 您绝对不需要安装32位JRE即可进行开发。您构建的Java代码不会跟踪您的64位。(我假设您没有使用JNI,这会使事情变得有些复杂。) 不过,您 可能 需要安装32位JRE进