在上面的①②处的代码,如果用①,那么程序就没有问题,而且应该是调用的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()
本文探讨了在Java多线程环境中,`wait()`方法的使用。通过一个`Depository`类的例子展示了在同步块或方法中调用`wait()`的正确方式。错误地调用`Thread.currentThread().wait()`会导致`IllegalMonitorStateException`,因为当前线程并未持有对象锁。正确的做法是调用包含`wait()`方法的对象的实例,确保线程拥有正确的监视器上下文。
543

被折叠的 条评论
为什么被折叠?



