簡體   English   中英

原子操作是否需要Java中的同步

[英]Does Atomic operation need synchronization in Java

據我了解,原子操作是不可分割的,一個線程可以在線程2更改系統之前或在線程2進行更改之后看到系統狀態,但不能在兩者之間看到。

例如說我在2個線程之間的共享對象上有一個方法:

public void incrementMe() { 
 //incrementing a shared int for this example
 atomicInt.incrementAndGet();
}

例如,我們的原子int的初始值為5。現在線程1和線程2都同時調用了增量我。 會發生什么? 據我了解,線程1將看到值5並同時將其遞增到6,線程2將看到值5,因為增量是原子的,因此線程2可以在after之后更改但在兩者之間沒有看到值,因此將其增加到6,最后我將得到值6,而不是7。對嗎? 我想念東西嗎?

預先謝謝你

那是不對的。 根據定義,原子是在一個操作中完成的。 JVM在Unsafe.compareAndSwap使用Unsafe.compareAndSwap方法,該方法對單個處理器指令進行建模,該指令將增加值而無需擔心被搶占。 因此,線程1將值增加到6,線程2將值增加到7。

完全針對該用例進行了調整。 如果兩個線程讀一個,則另一個線程優先。 一個將收到6,其他7既不將看到的值5。

但是,請記住保持增加的值。

 public void incrementMe() {
   int xx = atomicInt.incrementAndGet();
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM