2015-06-01 110 views
0

我試圖找到一個乾淨的方式來寫出一個方法,可能或不可能包裹在基於布爾值的synchornized鎖。然而,我能找到這樣做的唯一方法是非常難看的。是否可以「同步if」語句?

boolean lock = true; 

void remove(Object o) { 
    if(lock) { 
     synchornized(this) { 
      // remove o 
     } 
    } else { 
     // remove o 
    } 
} 

但是,我想知道是否有更好的方法來做到這一點,也許是「同步如果」類型的語句?

+4

您可以同步該方法。不,這樣做並不難看。 – Maroun

+0

@MarounMaroun(public synchronized void remove)不僅會在「鎖定」爲真的情況下同步,然而,這是問題的關鍵。 – Hobbyist

+1

然後你的方法很好。 – Maroun

回答

0
  1. 您可以使用AtomicBoolean

    private final AtomicBoolean lock = new AtomicBoolean(false); 
    ... 
    
    // compare if it is false and set it to true, no synchronized needed 
    if (lock.compareAndSet(false, true)) { 
        statusMessage = "lock acquired"; 
    } else { 
        statusMessage = "I'm already locked"; 
    } 
    
  2. 或將方法定義​​。

您的鎖定電流檢查是不是在同步塊:

if(lock) { 
    synchronized(this) { 

因此將其設置爲false,前2個線程可以通過此檢查,真正的信號有synchronized(this)

相關問題