• 技术文章 >Java >java教程

    java notify和notifyAll的对比详细介绍

    黄舟黄舟2017-03-18 10:09:12原创937
    这篇文章主要介绍了 java notifynotifyAll的对比的相关资料,需要的朋友可以参考下

    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并发之线程间协作的两种方式:wait、notify、notifyAll和Condition

    wait, notify 和 notifyAll的正确用法

    通过实例讨论notify()和notifyAll()的本质区别

    以上就是java notify和notifyAll的对比详细介绍的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    上一篇:详细介绍java Map转Object与Object转Map实现代码 下一篇:详细介绍java通过ssh连接服务器执行shell命令详解及示例代码
    20期PHP线上班

    相关文章推荐

    • 【活动】充值PHP中文网VIP即送云服务器• 一文掌握Java8新特性Stream流的概念和使用• Java线程学习之并发编程知识点• 完全掌握Java中的抽象类和接口• Java中的set集合如何理解• 详细了解java多线程机制
    1/1

    PHP中文网