簡體   English   中英

Java原子變量set()vs compareAndSet()

[英]Java Atomic Variable set() vs compareAndSet()

我想知道原子類中set()和compareAndSet()之間的區別。 set()方法是否也確保原子過程? 例如這段代碼:

public class sampleAtomic{
    private static AtomicLong id = new AtomicLong(0);

    public void setWithSet(long newValue){
        id.set(newValue);
    }

    public void setWithCompareAndSet(long newValue){
        long oldVal;
        do{
            oldVal = id.get();
        }
        while(!id.compareAndGet(oldVal,newValue)
    }
}

這兩種方法是否相同?

setcompareAndSet方法的行為不同:

  • compareAndSet:如果當前值等於(==)到期望值,則以原子方式將值設置為給定的更新值。
  • set:設置為給定值。

set()方法是否也確保原子過程?

是。 它是原子的。 因為set新值只涉及一個操作。 以下是set方法的源代碼:

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

正如您從下面的open jdk代碼中看到的那樣。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.set%28long%29

set只是賦值,而compareAndSet正在進行額外的操作以確保原子性。

http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/concurrent/atomic/AtomicLong.java#AtomicLong.compareAndSet%28long%2Clong%29

設計任何原子操作需要考慮返回值(布爾值)。

暫無
暫無

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

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