Сегодня у меня было интервью, на котором я задавал кандидату довольно обычный и базовый вопрос о разнице между Thread.sleep()
и Object.wait()
. Я ожидал, что он ответит что-то вроде , например, , но он сказал, что эти методы в основном одно и то же, и, скорее всего, Thread.sleep
использует Object.wait()
внутри него, но сам sleep
не требует внешний замок Это не совсем правильный ответ, потому что в JDK 1.6 этот метод имеет следующую подпись.
public static native void sleep(long millis) throws InterruptedException;
Но моя вторая мысль заключалась в том, что это не так смешно. Можно использовать время ожидания, чтобы достичь того же эффекта. Взгляните на следующий фрагмент кода:
public class Thread implements Runnable {
private final Object sleepLock = new Object();
// other implementation details are skipped
public static void sleep(long millis) throws InterruptedException {
synchronized (getCurrentThread().sleepLock){
getCurrentThread().sleepLock.wait(millis);
}
}
В этом случае sleepLock
- это объект, который используется, в частности, для блока синхронизации внутри метода sleep
. Я предполагаю, что инженеры Sun / Oracle знают о бритве Оккама, поэтому sleep
имеет встроенную реализацию специально, поэтому мой вопрос заключается в том, почему она использует собственные вызовы.
Единственная идея, которая мне пришла в голову - это предположение, что кто-то может найти полезный вызов, такой как Thread.sleep(0)
. Имеет смысл для управления планировщиком согласно этой статье:
Это имеет специальный эффект очистки кванта текущего потока и помещения его в конец очереди для его уровня приоритета. Другими словами, все выполняемые потоки с одинаковым приоритетом (и потоки с более высоким приоритетом) получат возможность запустить до того, как полученному потоку в следующий раз дадут время ЦП.
Таким образом, synchronized
блок даст ненужные накладные расходы.
Знаете ли вы какие-либо другие причины не использовать синхронизированное ожидание в реализации Thread.sleep()
?