2016-12-10 23 views
0

我經常遇到這樣的情況,即如果發生某些事情與預期不同,就會觸發某個操作。不幸的是,compareAndSet不適合這種原子問題。我需要像compareAndSetIfUnequal這樣的東西。目前我使用類似下面的代碼,但恐怕它是昂貴的:是否有一個compareAndSet for!= value(compareAndSetIfUnequal)?

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

compareAndSetIfUnequal是功能上與簡單的設置相同,不是嗎? –

回答

1

假設你擔心你的榜樣重複使用getAndSet的,我首先要提醒之前,你剖析代碼擔心太多。你的代碼很乾淨。

但是,如果你想避免「設置」部分(與原子操作的相關硬件開銷),你需要循環這一個自己使用與compareAndSet得到:

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個處理器的超級計算機上,並且處理節點之間的異常高延遲,那麼原子操作肯定會導致更大的開銷?它將如何擴展?然後我意識到我不是在治療癌症或模擬颶風,並且可能不會超過兩個CPU/40內核。無論如何,即使在實踐中不需要,我也將理論考慮作爲思考實驗。 –

+0

當我必須意識到這個問題時,我討厭編寫問題的時刻:該死的我不是編碼治療癌症,繼續下去。 ;-) – Thomas

相關問題