有条件地定义同步块

时间:2019-02-22 01:28:37

标签: java multithreading concurrency locking synchronized

说我有一个方法:

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(()->{


  });
}

还有另一种方法可以实现,而无需回调吗?

1 个答案:

答案 0 :(得分:9)

也许可以使用ReentrantLock(即more flexible and powerful)来代替synchronized关键字。

示例:

ReentrantLock lock = ...;


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

    try {
        // do something

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