Написание своего класса Lock

304
18 апреля 2017, 07:55

У меня задача написать свой механизм блокировок Lock. И я нашел уже готовый самописный пример, упрощенной версии этого механизма:

public class Lock {
    boolean isLocked = false;
    Thread  lockedBy = null;
    int     lockedCount = 0;
public synchronized void lock() throws InterruptedException{
      Thread callingThread = Thread.currentThread();
      while(isLocked && lockedBy != callingThread){
          wait();
      }
      isLocked = true;
      lockedCount++;
      lockedBy = callingThread;
  }

  public synchronized void unlock(){
      if(Thread.curentThread() == this.lockedBy) {
          lockedCount--;
            if(lockedCount == 0){
               isLocked = false;
               notify();
            }
        }
    }
}

И меня ставят в ступор здесь несколько вещей:

1. Зачем нужен счетчик lockedCount какую проблему он решает?

2. Зачем нужен Thread callingThread = Thread.currentThread();? В чем идея этой проверки: lockedBy != callingThread? Какую проблему он решает?

Почему не сделать вот так, и успокоится:

public class Lock {
    private boolean isLocked = false;
    public synchronized void lock() throws InterruptedException {
        while(isLocked) {
            wait();
        }
        isLocked = true;
    }
    public synchronized void unlock(){
        isLocked = false;
        notify();
    }
}

Зачем нужны эти дополнительные проверки что за проблему они решают?

Answer 1
  1. Зачем нужен счетчик lockedCount какую проблему он решает?

Он позволяет потоку-владельцу блокировки блокировать ресурс многократно.

  1. Зачем нужен Thread callingThread = Thread.currentThread();? В чем идея этой проверки: lockedBy != callingThread? Какую проблему он решает?

Для возможности сравнить текущий поток с тем, что владеет lock в данный момент.

Почему не сделать вот так, и успокоиться

Сделайте, не проблема. Вот только что делать, если текущий поток вызовет lock() повторно?

READ ALSO
Не правильно по времени срабатывает alarmManager. Подскажите в чем ошибка, пожалуйста

Не правильно по времени срабатывает alarmManager. Подскажите в чем ошибка, пожалуйста

Проблема AlarmManager в том, что он НЕ гарантирует точного срабатывания в назначенное времяНа официальном сайте Android'a об этом написано - Alarm Manager

277
Встраивание API в андроид приложение [требует правки]

Встраивание API в андроид приложение [требует правки]

Нужно встроить api яндекс переводчика в мобильное приложение, на андроид начал программировать недавно, с API до этого не работал, поэтому уперся...

267
Помогите, не понимаю как использовать return в java

Помогите, не понимаю как использовать return в java

Вот вроде понимаю что return что-то возвращает, завершает процессы метода(функции), но что, как он это делает вообще не понимаюПересмотрел кучу...

322