2017-01-27 15 views
-1

このコードについて私に説明してもらえますか?内部の原子関数

public class Counter { 
     private AtomicInteger value = new AtomicInteger(); 

     public int incrementLongVersion(){//THIS PART2!!! 
       int oldValue = value.get(); 
       while (!value.compareAndSet(oldValue, oldValue+1)){ 
         oldValue = value.get(); 
       } 
       return oldValue+1; 
     } 

} 

私はなぜ私はちょうど

false 

にこのコード

!value.compareAndSet(oldValue, oldValue+1) 

を変更することはできません意味ですか?コンパイルエラーが発生することはありませんでしたが、理由は何ですか?

!value.compareAndSet(oldValue, oldValue+1) 

エラーはありません。それはあまりにも正しく偽ではないですか?

なぜ、私はそのループをクリアして "oldValue + 1"を返すだけでいいのですか?

ありがとうございます。あなたはは、その関数が何をするか、しかし、コンパイラは常にこの場合はfalseを、同じになり、戻り値をチェックするために与えられたメソッド呼び出しの本体を解析しません知っているfalseので

+1

あなたが戻ってきたら、古い値をどのように覚えているので、増分することができますか? –

+0

はい、 'AtomicInteger'には独自のインクリメントメソッドがあります。 –

+1

いいえ、それは常に偽ではありません。 –

答えて

1

incrementLongVersionが複数のスレッドから呼び出された場合、value.compareAndSet(oldValue, oldValue+1)falseを返します。 whileループの目的は、関数がすべての作業スレッド間で一意の値を返すことを確認することです。

これを実装するより良い方法は、AtomicIntegerincrementAndGetを単純に使用することです。

public class Counter { 
     private AtomicInteger value = new AtomicInteger(); 

     public int incrementLongVersion(){ 
       return value.incrementAndGet(); 
     } 

} 
関連する問題