呼叫同步/等待?

时间:2014-07-30 14:10:39

标签: java multithreading

有人可以帮我理解这个吗?

如果我们有一个班级:

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上被阻止,因为同步只允许一个线程一次访问对象实例?还是他们去等待状态?

2 个答案:

答案 0 :(得分:5)

在对象上获得锁定。在这种情况下,因为只有一个对象s,所有线程都试图在其上调用相同的方法method1,因此只有一个线程可以进入该方法。

  

尝试访问method1时其余线程怎么办?

你在这个对象上调用wait,因此锁被释放而其他线程将获得机会,但最后所有3个线程都会到达阻止状态因为没有人notify

在所有3个线程的wait()语句之后不执行任何操作。

  

它们是否在方法1上被阻止,因为同步只允许一个线程一次访问对象实例?

wait()释放锁定,因此这不会阻止其他线程访问相同的方法,但如果你没有调用notify,那么最后所有线程都将进入阻塞状态。

尝试将其可视化

enter image description here

enter image description here

答案 1 :(得分:3)

关键部分是wait()将释放调用线程正在同步的监视器,从而允许其他线程进入同一个块。

但是,请注意,它不会释放该线程也持有的任何其他监视器,这可能会导致deadlock。这就是嵌套同步调用可能很危险的原因。

此监控行为记录为here

  

当前线程必须拥有此对象的监视器。线程   释放此监视器的所有权并等待另一个线程   通知在此对象的监视器上等待的线程也会唤醒   通过调用notify方法或notifyAll方法。该   线程然后等待,直到它可以重新获得监视器的所有权和   恢复执行。