广

Java编程

  • IOS开发
  • android开发
  • PHP编程
  • JavaScript
  • ASP.NET
  • ASP编程
  • JSP编程
  • Java编程
  • 易语言
  • Ruby编程
  • Perl编程
  • AJAX
  • 正则表达式
  • C语言
  • 编程开发

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

    2018-11-14 08:49:33 次阅读 稿源:互联网
    零七广告

    当一个线程进入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

    零七网部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与零七网进行文章共享合作。

    零七广告
    零七广告
    零七广告
    零七广告