Условно определить синхронизированный блок - PullRequest
0 голосов
/ 22 февраля 2019

Допустим, у меня есть метод:

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 голосов
/ 22 февраля 2019

Вместо ключевого слова synchronized, возможно, вы можете использовать ReentrantLock (что более гибкий и мощный ).

Пример:

ReentrantLock lock = ...;


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

    try {
        // do something

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