Спецификация Java 11: 17.3. Sleep и Yield

Thread.sleep переводит выполняющийся в данный момент поток в спящий режим (временно прекращает выполнение) на указанную продолжительность, в зависимости от точности и аккуратности системных таймеров и планировщиков. Поток не теряет права собственности на какие-либо мониторы, и возобновление выполнения будет зависеть от планирования и доступности процессоров, на которых будет выполняться поток.

Важно отметить, что ни Thread.sleep, ни Thread.yield не имеют семантики синхронизации. В частности, компилятору не нужно сбрасывать записи, кэшированные в регистрах, в общую память перед вызовом Thread.sleep или Thread.yield, а также компилятору не нужно перезагружать значения, кэшированные в регистрах, после вызова Thread.sleep или Thread.yield.

Например, в следующем (сломанном) фрагменте кода предположим, что this.done является не-volatile boolean полем:

while (!this.done)
    Thread.sleep(1000);

Компилятор может прочитать поле this.done только один раз и повторно использовать кэшированное значение при каждом выполнении цикла. Это означало бы, что цикл никогда не завершится, даже если другой поток изменит значение this.done.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки