Я всегда думал, что синхронизация метода run в классе java, который реализует Runnable, избыточна. Я пытаюсь понять, почему люди делают это:
public class ThreadedClass implements Runnable{
//other stuff
public synchronized void run(){
while(true)
//do some stuff in a thread
}
}
}
Кажется излишним и ненужным, поскольку они получают блокировку объекта для другого потока. Вернее, они делают явным, что только один поток имеет доступ к методу run(). Но так как его метод запуска, разве это не его собственный поток? Следовательно, только он может получить доступ к нему и ему не нужен отдельный механизм блокировки?
Я нашел предложение в Интернете, что, синхронизируя метод запуска, вы могли бы потенциально создать очередь потоков фактического потока, например:
public void createThreadQueue(){
ThreadedClass a = new ThreadedClass();
new Thread(a, "First one").start();
new Thread(a, "Second one, waiting on the first one").start();
new Thread(a, "Third one, waiting on the other two...").start();
}
Я бы никогда не делал этого лично, но при этом возникает вопрос, почему кто-то будет синхронизировать метод run. Любые идеи, почему или почему не следует синхронизировать метод запуска?