是否可以“同步if”声明?

时间:2015-06-01 06:43:26

标签: java

我正在尝试找到一种干净的方法来编写一个方法,该方法可能会或可能不会基于布尔值包含在synchornized锁中。然而,我能找到的唯一方法是非常难看。

boolean lock = true;

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

但是,我想知道是否有更好的方法可以做到这一点,也许是“同步if”类型的声明?

1 个答案:

答案 0 :(得分:1)

  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. 或将方法定义为synchronized

  3. 您当前对锁的检查不在同步块中:

    if(lock) {
        synchronized(this) {
    

    因此,在您将其设置为false之前,2个线程可以通过此检查,真正的信号量为synchronized(this)