美文网首页
wait/notify

wait/notify

作者: 一个小草人 | 来源:发表于2019-01-27 14:12 被阅读0次

1.两者只能运行在同步方法或者同步代码块中
2.某对象调用wait/notify方法前,必须获得【调用对象的锁】,其他锁不行;
3.调用obj.wait(),当wait执行时,就会先执行释放obj锁
4.当wait/notify搭配使用时,两者的同步锁不一致、锁错误、未设置同步锁,程序崩溃报错误:Caused by: java.lang.IllegalMonitorStateException: object not locked by thread before wait()
5.wait/notify是定义在Object内的方法
6.wait/notify为什么必须放在同步块中?
synchronized用于实现线程同步。
如果不放在同步块中,由于cpu执行的随机性,有可能会出现我们预期之外的情况。
把它们放到同步块中,我们就可以手动对线程的执行顺序进行调整。
https://blog.csdn.net/lengxiao1993/article/details/52296220
7.为什么wait必须放在while循环中?
因为wait调用后,线程会挂起,当notify唤醒线程后,线程会解除wait状态,重新去参与竞争对象锁,当得到锁后,会继续执行wait后面的代码,用while的话还会进行条件判断,避免【虚假唤醒】的出现,而if的话并不进行条件判断,从而有可能导致bug

// 线程A 的代码
synchronized(obj_A)
{
    while(!condition){ 
        wait();
    }
    // do something 
}

8.notify并不释放锁,只是通知调用过wait的线程,可以去参与获取锁的竞争了,但不是马上得到锁,当notify后面的代码都执行完后,才释放锁
https://turbosky.iteye.com/blog/2314144
9.通过wait/notify可以实现线程间通信

相关文章

网友评论

      本文标题:wait/notify

      本文链接:https://www.haomeiwen.com/subject/atmmjqtx.html