有条件地定义同步块

Conditionally define synchronized block

说我有一个方法:

public void run(){
  synchronized(this.foo){

 }
}

但有时当我 运行 使用此方法时,我不需要同步任何内容。

有条件地同步某些东西的好模式是什么?我能想到的唯一模式是回调,像这样:

public void conditionalSync(Runnable r){
   if(bar){
      r.run();
      return;
   }

  synchronized(this.foo){
     r.run();
  }
}

public void run(){
  this.conditionalSync(()->{


  });
}

还有没有回调的其他方法吗?

而不是 synchronized 关键字,也许您可​​以使用 ReentrantLock(which is more flexible and powerful)。

示例:

ReentrantLock lock = ...;


public void run(){
    if (bar) {
        lock.lock();
    }

    try {
        // do something

    } finally {
        if (lock.isHeldByCurrentThread()) {
            lock.unlock();
        }
    }
}