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


Answers:


100
  • 除long和double以外的所有基本类型分配
  • 所有参考文献的分配
  • 易变变量的所有分配
  • java.concurrent.Atomic *类的所有操作

也许还有更多。看看jls

如评论中所述,原子性并不意味着可见性。因此int,即使保证另一个线程看不到部分写入的内容,也可能永远看不到新值。

尽管无法保证,但long和double的操作也可以在普通的64位CPU原子上进行。另请参阅此功能请求


21
volatile多头和
双头的

12
另外,要记住,虽然操作是原子,这些操作的可视性可能无法在多线程应用程序担保,除非采取特殊措施(这里的细节的方式,以错综复杂的评论来形容..)

5
64 bit jvm, long and double assignments are also atomic.你确定吗?我会说它们是用于编译的代码,但是解释代码呢?也许您是对的,但是有保证吗?
maaartinus 2011年

4
规范仍然没有强制要求64位JVM为长时间分配和双重分配提供原子性。java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7用它的名言,“此行为是特定于实现的”。但是,64位VM很有可能将其实现为原子操作。
sjlee 2011年

1
恕我直言,正常的引用分配是原子的,但是AtomicReference提供了更多功能:compareAndSet和getAndSet,如果没有同步,您将无法实现这些目标。
maaartinus 2011年

5

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

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

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

5
..threadsafe,从某种意义上说,该值将始终完全是原始值或设置值。由于缺少“ volatile”或“ synchronized”,因此其他线程仍然看不到最新值。
Mikko Wilkman'2

1
+1 @MikkoWilkman所说的话。这段代码不应该使用,因为从内存可见性的角度来看,它绝对不是线程安全的。
指节针chi

0

它将似乎是多头的任务是原子的基础上,AtomicLong.java此方法:

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

请注意,没有任何同步。


3
看看的声明value。是volatile
maaartinus

2
valuevolatile没有任何的分配value原子,它只是避免了“出版”的问题。
Lyle Z

7
两者都可以,请参见JLS,第17.7节:易失的long和double值的写入和读取始终是原子的。
maaartinus

我认为,@ LyleZ在此主题中最有价值的评论。
stdout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.