前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >wait()方法和notify()方法使用时的注意事项

wait()方法和notify()方法使用时的注意事项

作者头像
吉林乌拉
发布2019-08-14 17:49:50
1.3K0
发布2019-08-14 17:49:50
举报
文章被收录于专栏:吉林乌拉吉林乌拉
  • wait()方法和notify()方法在使用时都有一个前提条件,必须都要获取当前对象的锁。也就是说如果wait()方法和notify()方法在使用时没有获取到锁时,程序就会直接抛出异常。

我们看程序出线了异常。原因是我们没有添加synchronized关键字,所以线程获取不到锁,而直接抛出的异常。

  • wait()方法在执行完成后,会立刻释放对象的锁,这时其它线程依然可以执行wait()方法所在的synchronized同步方法。而notify()方法在执行完成后不会立即释放对象的锁,直到这个线程的synchronized同步方法执行完时才会释放锁。

我们看两个线程都暂停了,这就说明两个线程都获得了执行,原因就是上面分析的一样,wait()方法在执行完会立即释放对象的锁,所以线程一执行完时,线程二就可以直接获取到锁并执行,所以输出是异步显示的。下面我们在看一下notify()方法的事例。

我们看线程是同步执行的。原因是notify()方法在执行后不会立刻释放对象的锁,所以线程一在执行notify()方法后,线程二虽然已经启动成功,但它获取不到当前对象的锁,因为线程一还没有将锁释放,所以线程二只能等待因为方法是synchronized同步方法,所以输出信息是同步执行的。

  • wait()方法的本质是将当前线程添加到等待队列中,它不是线程的结束,因为它还可以恢复。notify()方法的本质是将等待队列中某一个线程使它退出等待队列。但如果等待队列中的线程有很多,notify()方法也只是随机抽取一个线程让它退出等待队列。

我们看线程一已经被唤醒了,然后继续执行了synchronized同步方法里的内容。

线程状态图

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-07,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档