Java中的哪些操作被认为是原子的?

时间:2011-01-21 07:49:46

标签: java multithreading atomicity

Java中的哪些操作被视为原子操作?

3 个答案:

答案 0 :(得分:92)

  • 除了long和double
  • 之外的所有原始类型的赋值
  • 所有参考作业
  • 所有易变变量的分配
  • java.concurrent.Atomic * classes
  • 的所有操作

也许更多。查看jls

如评论中所述,原子性并不意味着可见性。因此,虽然保证另一个线程不会看到部分写入int,但它可能永远不会看到新值。

long和double上的操作在常见的64位CPU上atomic as well,尽管不能保证。另请参阅此feature request

答案 1 :(得分:4)

在Java中,32位或更小数量的读写保证是原子的 原子,我们的意思是每个动作都在一个步骤中发生,不能被打断。因此,当我们有多线程应用程序时,读写操作是线程安全的,不需要进行同步。

例如,以下代码是线程安全的:

public class ThreadSafe   
  {  
    private int x;  
    public void setX(int x)  
          {
           this.x = x;
           } 
  }

答案 2 :(得分:0)

根据AtomicLong.java中的此方法,似乎 long的赋值是原子的:

public final void set(long newValue) {
    value = newValue;
}

请注意,没有任何同步。