Я всегда думал, что синхронизация метода запуска в 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();
}
Я бы никогда не сделал этого лично, но возникает вопрос, зачем кому-то синхронизировать метод запуска. Есть идеи, почему или почему не следует синхронизировать метод запуска?
if(!hasRun.CompareAndSwap(false,true))return;
в запуске лучше (поскольку оно не блокирует поток и гарантирует, что запуск выполняется только один раз), но требует дополнительного кода и отдельной переменной - person ratchet freak   schedule 06.09.2011