В Java, почему поток должен конкурировать за ресурсы после пробуждения из .wait ()? - PullRequest
0 голосов
/ 06 ноября 2018

Например, в этом классическом фрагменте кода потребителя-производителя:

synchronized (this) {
  while (queue.isEmpty()) {
    this.wait();
  }
  queue.remove();
  this.notifyAll();
}

Поток потребителя .wait(), о котором уведомляет производитель, активируется, а затем конкурирует за ресурс с другими потоками потребителя, ожидающими synchronized (this). Это вызывает состояние гонки. Но почему бы просто не позволить потребителю .wait() удерживать ресурс, пока он не существует, блок synchronized?

1 Ответ

0 голосов
/ 06 ноября 2018

Это наивный вопрос. Благодаря комментариям, я думаю, теперь я понимаю логику дизайна:

  1. Поток .wait() не может просто удерживать блокировку во время ожидания, потому что таким образом производители не могут писать в очередь.
  2. Когда .wait() поток просыпается, почему нельзя просто гарантировать, что он получит блокировку? Поскольку по причине # 1, поток .wait() должен отказаться от ресурса перед ожиданием запуска. В то же время другие потребительские потоки могут достигнуть стадии .wait(). Так как есть много ожидающих потока, кто должен получить ресурс? Java решила обрабатывать все потоки одинаково, не говоря уже о времени ожидания.
...