基于Java多线程notify与notifyall的区别分析

 更新时间:2013年05月10日 10:20:21   作者:  
本篇文章对Java中多线程notify与notifyall的区别进行了详细的分析介绍。需要的朋友参考下

当一个线程进入wait之后,就必须等其他线程notify/notifyall,使用notifyall,可以唤醒
所有处于wait状态的线程,使其重新进入锁的争夺队列中,而notify只能唤醒一个。注意,任何时候只有一个线程可以获得锁,也就是说只有一个线程可以运行synchronized 中的代码,notifyall只是让处于wait的线程重新拥有锁的争夺权,但是只会有一个获得锁并执行。

那么notify和notifyall在效果上又什么实质区别呢?
主要的效果区别是notify用得不好容易导致死锁,例如下面提到的例子。

复制代码 代码如下:

public synchronized void put(Object o) {

    while (buf.size()==MAX_SIZE) {

        wait(); // called if the buffer is full (try/catch removed for brevity)

    }

    buf.add(o);

    notify(); // called in case there are any getters or putters waiting

}

复制代码 代码如下:

public synchronized Object get() {

    // Y: this is where C2 tries to acquire the lock (i.e. at the beginning of the method)

    while (buf.size()==0) {

        wait(); // called if the buffer is empty (try/catch removed for brevity)

        // X: this is where C1 tries to re-acquire the lock (see below)

    }

    Object o = buf.remove(0);

    notify(); // called if there are any getters or putters waiting

    return o;

}

所以除非你非常确定notify没有问题,大部分情况还是是用notifyall。

更多详细的介绍可以参看:
http://stackoverflow.com/questions/37026/java-notify-vs-notifyall-all-over-again

相关文章

  • Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture

    Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture

    这篇文章主要介绍了Java数据结构及算法实例:考拉兹猜想 Collatz Conjecture,本文直接给出实现代码,代码中包含详细注释,需要的朋友可以参考下
    2015-06-06
  • Java数据结构之链表(动力节点之Java学院整理)

    Java数据结构之链表(动力节点之Java学院整理)

    这篇文章主要介绍了Java数据结构之链表(动力节点之Java学院整理)的相关资料,需要的朋友可以参考下
    2017-04-04
  • Mybatis中动态SQL,if,where,foreach的使用教程详解

    Mybatis中动态SQL,if,where,foreach的使用教程详解

    MyBatis的动态SQL是基于OGNL表达式的,它可以帮助我们方便的在SQL语句中实现某些逻辑。这篇文章主要介绍了Mybatis中动态SQL,if,where,foreach的使用教程,需要的朋友可以参考下
    2017-11-11
  • Spring Retry重试框架的使用讲解

    Spring Retry重试框架的使用讲解

    重试的使用场景比较多,比如调用远程服务时,由于网络或者服务端响应慢导致调用超时,此时可以多重试几次。用定时任务也可以实现重试的效果,但比较麻烦,用Spring Retry的话一个注解搞定所有,感兴趣的可以了解一下
    2023-01-01
  • SpringBoot集成MQTT示例详解

    SpringBoot集成MQTT示例详解

    这篇文章主要为大家介绍了SpringBoot集成MQTT示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • IDEA中Services栏不显示的解决方案小结

    IDEA中Services栏不显示的解决方案小结

    正常编译完一个SpringBoot或者SringCloud项目之后,Services都会显示出你有哪些服务,如果没有services栏怎么解决呢?下面小编给大家分享IDEA中Services栏不显示的解决方案小结,感兴趣的朋友一起看看吧
    2021-08-08
  • Java 实战范例之精美网上音乐平台的实现

    Java 实战范例之精美网上音乐平台的实现

    读万卷书不如行万里路,只学书上的理论是远远不够的,只有在实战中才能获得能力的提升,本篇文章手把手带你用java+vue+Springboot+ssm+mysql+maven+redis实现一个前后端分离的精美网上音乐平台,大家可以在过程中查缺补漏,提升水平
    2021-11-11
  • Java和C语言分别实现水仙花数及拓展代码

    Java和C语言分别实现水仙花数及拓展代码

    这篇文章主要介绍了分别用Java和C语言实现水仙花数,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-11-11
  • java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    java 查询oracle数据库所有表DatabaseMetaData的用法(详解)

    下面小编就为大家带来一篇java 查询oracle数据库所有表DatabaseMetaData的用法(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-11-11
  • SpringBoot @Scheduled Cron表达式使用方式

    SpringBoot @Scheduled Cron表达式使用方式

    这篇文章主要介绍了SpringBoot @Scheduled Cron表达式使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03

最新评论