2016-12-10 9 views
0

私は、何かが予想外の場合にトリガーされるべき行動が存在することがよくあります。残念ながら、compareAndSetはこの種の原子的な問題には適していません。私はcompareAndSetIfUnequalのようなものが必要です。現在、私は以下のコードのようなものを使用しますが、私はそれが高価である怖い:!= value(compareAndSetIfUnequal)のcompareAndSetはありますか?

private AtomicReference<T> atomic = new AtomicReference<T>(null); 
public static void doIfUnequal(T obj) {     
    if(atomic.getAndSet(obj) != obj) { 
     doSomething(); 
    } 
} 
+0

compareAndSetIfUnequalがある:あなたが「設定」の部分(とアトミックオペレーションの関連ハードウェアのオーバーヘッド)を回避したい場合は

しかし、あなたはループ自身がのcompareAndSetを取得使用して、この1する必要があります機能的には単純なセットと同じですね。 –

答えて

1

はあなたの例ではgetAndSetの繰り返し使用を懸念していると仮定すると、私は最初の前にコードをプロファイルすることを思い出させるしたいのですがあまりにも心配しています。あなたのコードはきれいです。

private AtomicReference<T> atomic = new AtomicReference<T>(null); 
public static void doIfUnequal(T obj) { 
    T curVal; 
    while((curVal = atomic.get()) != obj) { 
     if(atomic.compareAndSet(curVal, obj)) { 
      doSomething(); 
      break; 
     } 
    } 
} 
+0

はい、私はコストを設定することを目指していましたが、最適なものを探すのは理論的だと私は同意しますが、実際には問題はありません。 – Thomas

+1

私は、自分のコードが10,000台のプロセッサを搭載したスーパーコンピュータ上で実行されていて、アトミックな操作で大きなオーバーヘッドが発生する可能性のある処理ノード間の待ち時間が非常に長い場合はどうですか?それはどのようにスケールされますか?その後、私は癌やハリケーンの治療法に取り組んでいないと認識しており、おそらく2つのCPU/40コアを超えて拡張することはできません。とにかく、実際には必要でなくても思考実験としての理論的考察を感謝します。 –

+0

私は気づく必要があるときに問題をコード化する瞬間が嫌いです:私は治癒がんをコードしていません。 ;-) – Thomas

関連する問題