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线程应在t1之后打印SOP,但两个线程同时打印SOP。谁能告诉我为什么?
答案 0 :(得分:3)
您正在创建班级的两个实例。
synchronized
可以防止不同的方法并行调用相同的方法上的方法。
它不会阻止在不同的对象上并行调用方法!
答案 1 :(得分:3)
synchronized
方法隐式在this
上同步。在您的情况下,ThreadRunnable
。
但每个线程都有自己的实例,因此它们使用两个不同的监视器。
您有多种方法可以解决您的问题,例如:
private static final Object lock = new Object();
作为具有同步块的监视器。Thread t2 = new Thread(tr);
答案 2 :(得分:1)
没有相互排斥。这两个对象都有自己独立的监视器,它们在synchronized
处获取,因此它们都在同一时间运行。
如果您想看到差异,请将tr
传递给您的第二个帖子。然后你有2个线程共享1个对象(和一个锁)。