有人可以帮我理解这个吗?
如果我们有一个班级:
public class Sample{
public synchronized method1(){ //Line1
....
wait(); //Line2
....
}
}
现在,当3个新线程尝试调用方法' method1'在同一个对象上
Sample s = new Sample();
Thread t1 = new Thread(); // t2 and t3
和每个线程的内部运行方法,我们调用s.method1()。 那么,它在这里如何运作?当t1访问method1时,它进入方法并调用wait。当其他线程尝试访问method1时呢?
它们是否在方法1上被阻止,因为同步只允许一个线程一次访问对象实例?还是他们去等待状态?
答案 0 :(得分:5)
在对象上获得锁定。在这种情况下,因为只有一个对象s
,所有线程都试图在其上调用相同的方法method1
,因此只有一个线程可以进入该方法。
尝试访问method1时其余线程怎么办?
你在这个对象上调用wait
,因此锁被释放而其他线程将获得机会,但最后所有3个线程都会到达阻止状态因为没有人notify
。
在所有3个线程的wait()
语句之后不执行任何操作。
它们是否在方法1上被阻止,因为同步只允许一个线程一次访问对象实例?
wait()
释放锁定,因此这不会阻止其他线程访问相同的方法,但如果你没有调用notify
,那么最后所有线程都将进入阻塞状态。
尝试将其可视化
答案 1 :(得分:3)