Планирование потоков и синхронизация - PullRequest
0 голосов
/ 08 января 2019

Возможно ли планировщику потока отменить планирование потока, удерживающего блокировку в синхронизированном блоке и находящегося в середине его выполнения? Если да, то приводит ли незапланированное выполнение к потоку освобождения блокировки? Предположим, что поток не вызывает метод, такой как wait/yield и т. Д.

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

1 Ответ

0 голосов
/ 09 января 2019

Возможно ли в планировщике потоков отменить планирование потока, удерживающего [блокировку]?

Да, это может происходить превентивно во многих алгоритмах планирования . должно произойти, если поток выполняет системный вызов блокировки (например, для ожидания ввода).

Если да, то приводит ли незапланированное выполнение к потоку освобождения блокировки?

Абсолютно нет! Это уничтожило бы цель блокировки и сломало бы большинство многопоточных программ.


Еда на вынос: Ваши критические секции должны быть как можно короче! Не позволяйте потокам B, C, D и E блокироваться, ожидая, пока поток A снимет некоторую блокировку, когда поток A заблокирован, выполняя длительные вычисления (или, что еще хуже, ожидание ввода).

...