java notify和notifyAll的对比

 更新时间:2017年02月09日 17:16:12   投稿:lqh  
这篇文章主要介绍了 java notify和notifyAll的对比的相关资料,需要的朋友可以参考下

 java notify和notifyAll

首先从名字可以了解,notify是通知一个线程获取锁,notifyAll是通知所有相关的线程去竞争锁。

notify不能保证获得锁的线程,真正需要锁,并且可能产生死锁

举例1:

所有人(消费者线程)准备吃饭,食堂没有开放(没有释放锁)打饭窗口(锁),所有人等待(WAITING)。

食堂开饭打饭窗口(释放锁),并广播消息“开饭了”(notifyAll),所有人竞争排队,并等待吃饭(BLOCKED)。每一个人依次在打饭窗口(获得锁)打饭(RUNNABLE)。如果想吃饭就打完饭后离开(释放锁),不想吃饭就直接离开(释放锁)。如果吃完了还想吃,就主动等待下一次“开饭了”的消息(wait)。

食堂通知一个人来吃饭(notify),此人来到打饭窗口(获得锁)打饭(RUNNABLE),其他人都在等待开饭的消息(WAITING)。如果想吃饭就打完饭后离开(释放锁),不想吃饭就直接离开(释放锁)。如果吃完了还想吃,就主动等待下一次“开饭”的消息(WAITING)。
notify不能保证通知到真正想吃饭的人。

举例2:

两个生产者P1、P2,两个消费者C1、C2,共同操作一个队列,队列最大长度为1。

开始P1、P2、C1、C2都处于运行状态(RUNNABLE)。

C1先获得锁,P1、P2、C2为BLOCKED状态。C1发现队列为空,主动进入WAITING。C2接着获得锁,成为RUNNABLE状态,发现队列为空,主动进入WAITING。

P1接着获得锁,成为RUNNABLE状态,在队列中插入一个元素,notify到了另一个生产者P2。P1循环生产,发现队列不为空,成为WAITING。

P2成为RUNNABLE状态,发现队列有值,主动进入WAITING。

此时锁已被释放,但P1、P2、C1、C2都处于WAITING状态,没有线程去获取锁,死了。

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 如何实用Java实现合并、拆分PDF文档

    如何实用Java实现合并、拆分PDF文档

    这篇文章主要介绍了如何实用Java实现合并、拆分PDF文档,处理PDF文档时,这样的好处是对文档的存储、管理很方便。下面将通过Java程序代码介绍具体的PDF合并、拆分的方法,需要的朋友可以参考下
    2019-07-07
  • Maven引入外部jar的几种方法(小结)

    Maven引入外部jar的几种方法(小结)

    这篇文章主要介绍了Maven引入外部jar的几种方法(小结),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • 如何使用java判断是不是数字

    如何使用java判断是不是数字

    这篇文章主要给大家介绍了关于如何使用java判断是不是数字的相关资料,判断一个字符串是否为数字是Java开发中很常见的业务需求,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • 详解Java语言中一个字符占几个字节?

    详解Java语言中一个字符占几个字节?

    这篇文章主要介绍了Java语言中一个字符占几个字节,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • java使用DOM对XML文档进行增删改查操作实例代码

    java使用DOM对XML文档进行增删改查操作实例代码

    这篇文章主要介绍了java使用DOM对XML文档进行增删改查操作实例代码,实例涉及对xml文档的增删改查,小编觉得还是挺不错的,具有一定借鉴价值,需要的朋友可以参考下
    2018-02-02
  • 无感NullPointerException的值相等判断方法

    无感NullPointerException的值相等判断方法

    当我们需要去判断一个 入参/查库 返回的开关变量(通常是个Integer类型的)时,常常会写如下的if-else判断语句。但又会为在生产环境看到的「NullPointerException」感到困扰,遇到这个问题如何处理呢,下面小编通过本文给大家详细讲解,需要的朋友参考下吧
    2023-02-02
  • Apache Commons CLI构建命令行应用利器教程

    Apache Commons CLI构建命令行应用利器教程

    这篇文章主要为大家介绍了构建命令行应用利器Apache Commons CLI的使用教程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-12-12
  • Java 数据结构与算法系列精讲之队列

    Java 数据结构与算法系列精讲之队列

    这篇文章主要介绍了Java队列数据结构的实现,队列是一种特殊的线性表,只允许在表的队头进行删除操作,在表的后端进行插入操作,队列是一个有序表先进先出,想了解更多相关资料的小伙伴可以参考下面文章的详细内容
    2022-02-02
  • Java基于控制台界面实现ATM系统

    Java基于控制台界面实现ATM系统

    这篇文章主要为大家详细介绍了Java基于控制台界面实现ATM系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-05-05
  • 基于Java实现一个简单的数据同步组件

    基于Java实现一个简单的数据同步组件

    这篇文章主要为大家详细介绍了如何基于Java实现一个简单的数据同步组件,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以了解一下
    2023-06-06

最新评论