java原子操作

xde*_*000 4 java multithreading atomic

划分以下陈述是正确的:

int v = ++j;
Run Code Online (Sandbox Code Playgroud)

如:

  1. 读取j值(原子);
  2. 读取的值增加1(非原子可能被其他线程干扰);
  3. 将添加结果写入i(原子);
  4. 把我写成v(原子)

pol*_*nts 8

是,int(或更小的数据类型)读/写/算术运算是原子的.无论是32位还是64位,引用(读/写)也都是原子的.

然而,在64位操作longdouble可能不是原子.

JLS 17.7非原子化处理doublelong

一些实现可能发现将64位上的单个写操作longdouble值划分为相邻32位值上的两个写操作是方便的.为了效率,这种行为是特定于实现的; Java虚拟机可以原子地或分两部分自由地执行写入longdouble值.

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

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

请注意,前置或后置递增/递减运算符本身都不是原子的,甚至不是int或者byte:读/写/算术运算在明显不同的步骤中发生.

也可以看看