xde*_*000 4 java multithreading atomic
划分以下陈述是正确的:
int v = ++j;
Run Code Online (Sandbox Code Playgroud)
如:
是,int(或更小的数据类型)读/写/算术运算是原子的.无论是32位还是64位,引用(读/写)也都是原子的.
然而,在64位操作long和double可能不是原子.
double和long一些实现可能发现将64位上的单个写操作
long或double值划分为相邻32位值上的两个写操作是方便的.为了效率,这种行为是特定于实现的; Java虚拟机可以原子地或分两部分自由地执行写入long和double值.出于Java编程语言内存模型的目的,对non
volatilelong或doublevalue 的单个写入被视为两个单独的写入:每个32位半写一个.这可能导致线程从一次写入看到64位值的前32位,而从另一次写入看到第二次32位的情况.写入和读取volatile long以及double值始终是原子的.对引用的写入和读取始终是原子的,无论它们是实现为32位还是64位值.建议VM实现者尽可能避免拆分64位值.鼓励程序员将共享的64位值声明为
volatile或正确同步其程序以避免可能的复杂情况.
请注意,前置或后置递增/递减运算符本身都不是原子的,甚至不是int或者byte:读/写/算术运算在明显不同的步骤中发生.
| 归档时间: |
|
| 查看次数: |
742 次 |
| 最近记录: |