下列说法正确的是:
int v = ++j;
as:
- 读取j值(原子);
- 读取的值加 1(NON
原子可能的干扰
其他线程);
- 将相加结果写入i
(原子);
- 将 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 double
value 被视为两次单独的写入:每个 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(使用前将#替换为@)