如果我有这样的代码-
long x;
x = 0xFFFFFFFFL;
如果我在32位计算机上运行此代码,是否保证它是原子的,或者是否有可能不同的线程读取x,可能会得到不完整/垃圾值?
这是简短的摘要:
int
,char
,byte
,short
,boolean
,float
,读/写操作 总是 原子double
和long
,如果它们是volatile
,则读/写 总是 原子的因此,只有在读/写可能不是原子的情况下例外:
double
和long
,如果他们 不 申报volatile
,他们 不能保证 是原子所以,只要读原子/写入共享数据而言,你只需要做出volatile
的任何double
或long
。不管实际实现中使用了多少位,其他所有内容都已经保证是原子性的。
这里是相关部分,此处转载以供快速参考:
[的JLS
17.7非原子处理
double
和long
](http://docs.oracle.com/javase/specs/jls/se7/html/jls-17.html#jls-17.7)一些实现可能会发现将64位
long
或double
值的单个写操作分为相邻32位值的两个写操作很方便。为了提高效率,此行为是特定于实现的;Java虚拟机可以自由地执行原子和两部分的写入long
和double
值。出于Java编程语言内存模型的目的,一次对non-
volatile long
或double
value的写操作被视为两次单独的写操作:一个写给每个32位的一半。这可能导致线程从一次写入中看到64位值的前32位,而从另一次写入中看到后32位的情况。写和读的volatile long
和double
值始终原子。引用的写入和读取始终是原子的,无论它们是实现为32位还是64位值。鼓励VM实现者避免在可能的情况下拆分其64位值。鼓励程序员将共享的64位值声明为
volatile
或正确同步其程序,以避免可能的复杂性。
byte
可以在没有邻居干扰的情况下进行更新volatile
字段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进