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

sheo1314

sheo1314

2016-02-19 09:52

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的基于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://m.tulaoshi.com/bianchengyuyan/)

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

(本文来源于图老师网站,更多请访问http://m.tulaoshi.com/bianchengyuyan/)
展开更多 50%)
分享

猜你喜欢

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

编程语言 网络编程
基于Java多线程notify与notifyall的区别分析

java多线程之wait(),notify(),notifyAll()的详解分析

编程语言 网络编程
java多线程之wait(),notify(),notifyAll()的详解分析

s8lol主宰符文怎么配

英雄联盟 网络游戏
s8lol主宰符文怎么配

基于Java回顾之多线程详解

编程语言 网络编程
基于Java回顾之多线程详解

Java的wait(), notify()和notifyAll()使用心得

编程语言 网络编程
Java的wait(), notify()和notifyAll()使用心得

lol偷钱流符文搭配推荐

英雄联盟 网络游戏
lol偷钱流符文搭配推荐

java Thread 多线程

编程语言 网络编程
java Thread 多线程

关于Java多线程

编程语言 网络编程
关于Java多线程

lolAD刺客新符文搭配推荐

英雄联盟
lolAD刺客新符文搭配推荐

解析在Android中为TextView增加自定义HTML标签的实现方法

解析在Android中为TextView增加自定义HTML标签的实现方法

PHP 正则表达式验证中文的问题

PHP 正则表达式验证中文的问题
下拉加载更多内容 ↓