Java多线程学习 (三) Thread的wait()方法执行

来源:互联网 发布:大数据分析的书籍 编辑:程序博客网 时间:2024/05/17 02:47

 

 

在上面的①②处的代码,如果用①,那么程序就没有问题,而且应该是调用的Depository 类的方法,而不是当前线程的wait()方法。如果使用②的语句,那么会抛一个异常 java.lang.IllegalMonitorStateException: current thread not owner

.

请问第②语句为什么会报错?

第①句处为什么是调用的Depository类的wait()方法,而不是当前Thread的wait()方法

 

 

回复:

 

应该使用wait(),wait 方法的解释是Causes current thread to wait until another thread invokes the notify() method or the notifyAll() method for this object.举个例子:比如你有一个Depository 类的对象 d ,然后线程A要访问d的addLast()方法,因为这个addLast()方法时synchronized 所以线程A进入的时候就给这个对象d 加上锁,其它线程不允许访问,当执行到wait()时,线程A就会先打开对象A的锁,并在对象d 外面排队等待。对于IllegalMonitorStateException,我的理解是:一个对象的wait()方法只能在此对象的同步方法中被调用,意思是,这个对象在wait前是被加了锁的。你将addLast方法的synchronized 去掉运行也会抛出这样的异常。所以说你用wait()就可以了。Thread.currentThread().wait();这句话调用的是当前线程对象的wait()方法,当前线程对象没有被加锁。所以出错。
首先说一下,wait()跟notify() 和notifyAll() 方法是锁的方法,不是线程的方法。因为你的wait()在public synchronized void addLast(Product p) 里面,那么这个锁就是Depository 对象,也就是当前对象。请问第②语句为什么会报错?因为当前锁不是Thread.currentThread()

 

原创粉丝点击