java 原子操作

2024-01-07

下列说法正确的是:

int v = ++j;

as:

  1. 读取j值(原子);
  2. 读取的值加 1(NON 原子可能的干扰 其他线程);
  3. 将相加结果写入i (原子);
  4. 将 i 写入 v(原子)

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

但是,64位上的操作long and double可能不是原子的。

JLS 17.7 非原子处理double and long http://java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7

某些实现可能会发现在 64 位上划分单个写入操作很方便long or double值分成对相邻 32 位值的两个写入操作。为了提高效率,此行为是特定于实现的; Java虚拟机可以自由地执行写入操作long and double值原子地或分为两部分。

就 Java 编程语言内存模型而言,单次写入非volatile long or doublevalue 被视为两次单独的写入:每个 32 位一半写入一次。这可能会导致线程从一次写入中看到 64 位值的前 32 位,而从另一次写入中看到第二个 32 位。写入和读取volatile long and double值始终是原子的。引用的写入和读取始终是原子的,无论它们是实现为 32 位值还是 64 位值。

鼓励 VM 实现者尽可能避免拆分其 64 位值。鼓励程序员将共享 64 位值声明为volatile或正确同步他们的程序以避免可能的并发症。

请注意,前后递增/递减运算符本身都不是原子的,甚至在int or byte:读/写/算术操作发生在明显独立的步骤中。

See also

  • Java 教程/基础知识/并发/原子变量 http://download.oracle.com/javase/tutorial/essential/concurrency/atomicvars.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java 原子操作 的相关文章

随机推荐