A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

为什么wait(),notify(),notifyAll()只能写在同步锁里?

4 个回复

倒序浏览
这些方法的调用方式就是同步锁中的锁.方法,就是这样:
  1. synchronized (obj) { //obj是无意义对象,即锁
  2. obj.wait();
  3. }
复制代码

拥有钥匙的线程会进入这段代码,wait()让线程进入暂停状态。
如果wait()方法在这段代码外面,由于外面有多个线程,我们是不知道wait()到底是让哪一个线程暂停,而在同步锁里,只有拥有钥匙的线程才会进入,且只有这一个线程,所以wait()当然是让这一个线程暂停,其他两个方法也是这样的
回复 使用道具 举报
wait()是等待,notify()是唤醒,notifyAll()是唤醒所有,它们的出现是线程的几个状态之间切换时使用的语句,同步锁的出现时为了确保线程的安全,
回复 使用道具 举报
而且wait只能由要等待的线程自己调用而不能这样
Thread a = new Thread(xxxx);
a.start(); //线程开始运行
a.wait(); //线程暂停
a,notify(); //线程继续运行
而只能将调用wait()方法的语句放到线程所要执行的代码里面,并且还要在同步块里:
run()
{
Thread.currentThread().wait();
}

run()
{
synchronized(this) {
Thread.currentThread().wait();
}
}
都会报 java.lang.IllegalMonitorStateException。必须得
run()
{
Thread t = Thread.currentThread();
synchronized(t) {
t.wait();
}
}
这样写才没事,我实在搞不懂这样的话wait(),notify(),notifyAll()这几个方法有什么用呢?特别是notifyAll(),wait()不是只能停止一个线程吗?因为它只能在线程的对象上调用啊例如t.wait()就相当于t暂停,而再调用t.notify()那么t继续运行,始终暂停和唤醒的只有线程t呀
回复 使用道具 举报
wenweishan2015 发表于 2015-6-9 16:24
这些方法的调用方式就是同步锁中的锁.方法,就是这样:

拥有钥匙的线程会进入这段代码,wait()让线程进入 ...

谢谢,学习了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马