Сигнал гарантированно достигнет нити? - PullRequest
0 голосов
/ 07 сентября 2018

Допустим, у меня есть три потока: T1, T2, T3, блокировка lock и некоторое условие cond на ресурсе Resource.

T1 получает блокировку и теперь делает cond.await() из-за какого-то условия, а T2 получает эту блокировку и делает cond.signal(), а затем переходит к lock.unlock(), но некоторое время T3 также пытался чтобы получить блокировку, чтобы она была на линии lock.lock(), что именно происходит?

Восстанавливает ли T2 блокировку или T3 получает ее, или это случайно, на основе шойдлера?

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Каждый раз, когда выдается сигнал, один из ожидающих потоков удаляется и возвращается в набор записей, чтобы он мог получить шанс на запуск. С точки зрения signalAll все ожидающие потоки будут удалены из набора ожидания и помещены обратно в набор записей, чтобы у них была возможность запуска.

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

Хорошее объяснение здесь

0 голосов
/ 07 сентября 2018

Если вы читаете документацию, то есть javadoc ReentrantLock, он конкретно отвечает на этот вопрос в 3-м абзаце:

Конструктор для этого класса принимает необязательный параметр fairness . Если задано значение true, в условиях конкуренции блокировки блокируют доступ к самому длинному ожидающему потоку. В противном случае эта блокировка не гарантирует какой-либо конкретный порядок доступа.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...