【发布时间】:2011-06-12 23:52:21
【问题描述】:
Java 中的哪些操作被认为是原子的?
【问题讨论】:
标签: java multithreading atomic
Java 中的哪些操作被认为是原子的?
【问题讨论】:
标签: java multithreading atomic
也许还有更多。看jls。
如 cmets 中所述,原子性并不意味着可见性。因此,虽然可以保证另一个线程不会看到部分写入的 int,但它可能永远不会看到新值。
long 和 double 上的操作是在常见的 64 位 CPU atomic as well 上进行的,尽管不能保证。另请参阅feature request。
【讨论】:
64 bit jvm, long and double assignments are also atomic. 你确定吗?我会说它们用于编译代码,但是解释代码呢?可能你是对的,但有什么保证吗?
在Java中,32位或更小量的读写保证是原子的。
原子,我们的意思是每个动作都在一个步骤中发生并且不能被打断。因此,当我们有多线程应用程序时,读写操作是线程安全的,不需要同步。
例如,以下代码是线程安全的:
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
【讨论】:
根据 AtomicLong.java 中的这个方法,long 的赋值似乎是原子的:
public final void set(long newValue) {
value = newValue;
}
注意没有任何同步。
【讨论】:
value的声明。这是volatile。
value 是volatile 不会使value 的分配原子化,它只是避免了“发布”问题。