Поведение метода sleep() в блоке синхронизации
class ThreadRunnable implements Runnable{
synchronized public void run(){
System.out.println("In Runnable implemented class");
try {
Thread.sleep(60000);
System.out.println("sleeping over");
System.out.println(System.currentTimeMillis());
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public class Sample {
public static void main(String [] args){
ThreadRunnable tr = new ThreadRunnable();
Thread t1 = new Thread(tr);
Thread t2 = new Thread(new ThreadRunnable());
t1.start();
t2.start();
}
}
Как и в методе синхронизации, поток t2 должен печатать SOP после t1, но оба потока печатают SOP одновременно. Кто-нибудь может сказать мне, почему?
3 ответа
synchronized
метод неявно синхронизируется по this
, В вашем случае экземпляр ThreadRunnable
,
Но у каждого потока есть свой экземпляр, поэтому они используют два разных монитора.
У вас есть несколько вариантов решения вашей проблемы, например:
- использовать
private static final Object lock = new Object();
как монитор с синхронизированным блоком. - или проще
Thread t2 = new Thread(tr);
Вы создаете два экземпляра вашего класса.
synchronized
предотвращает параллельное обращение разных методов к одному и тому же методу.
Это не препятствует параллельному вызову методов для разных объектов!
Там нет взаимного исключения. Оба объекта имеют свои собственные отдельные мониторы, которые они получают в synchronized
так что они оба бегут одновременно.
Если вы хотите увидеть разницу, пройдите tr
к вашей второй теме, а также. Тогда у вас есть 2 потока, совместно использующих 1 объект (и один замок).