Насколько я понимаю, когда мы создаем Thread
, мы используем новое ключевое слово. start()
вызывается для нового объекта Thread
каждый раз, когда мы хотим запустить Thread
.
Это заставило меня задать вопрос: почему класс start()
Thread в Java synchronized
.
Почему синхронизируется start() класса Thread в Java.
Вы не можете создать тему более одного раза. Но было бы еще хуже, если бы два потока одновременно попытались запустить один и тот же поток.
Почему?
Потому что это нарушит логику, которая не позволяет приложению запускать поток дважды!
Итак... они объявили start
как synchronized
, и неловкое состояние гонки удалось избежать.
Я думаю, вы предполагаете, что потоки всегда запускаются так:
new Thread(...).start();
но язык позволяет вам создать Thread
в одном потоке и передать его в другой поток, который его запускает. Я не знаю, зачем это нужно делать, но я бы удивился, если бы кто-то это не попробовал.
Одним из примеров является перехватчик выключения, который вы можете зарегистрировать с помощью Runtime.addShutdownHook: вы передаете ему незапущенный поток, и при выходе среда выполнения запускает этот перехват выключения.
Ах... конечно!
Нельзя запускать одну и ту же тему несколько раз.