Java之notify和notifyAll区别
在Java中notify()和notifyAll()方法都是Object对象用于通知处在等待该对象的线程的方法。
两者的最大区别在于:
notifyAll方法
使所有原来在该对象上等待被notify的所有线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。
notify方法
它只是选择一个wait状态线程进行通知,并使它获得该对象上的锁,但不惊动其他同样在等待被该对象notify的线程,当第一个线程运行完毕以后释放对象上的锁此时如果该对象没有再次使用notify语句,则即便该对象已经空闲,其他wait状态等待的线程由于没有得到该对象的通知,继续处在wait状态,直到这个对象发出一个notify或notifyAll,它们等待的是被notify或notifyAll,而不是锁。
例子:
public class NotifyTest {private String flag[] = {"true"};class NotifyThread extends Thread {public NotifyThread(String name) {super(name);}public void run() {try {sleep(3000); // 推迟3秒钟通知} catch (InterruptedException e) {e.printStackTrace();}synchronized (flag) {flag[0] = "false";flag.notifyAll();}}}class WaitThread extends Thread {public WaitThread(String name) {super(name);}public void run() {System.out.println(getName() + " flag:" + flag);synchronized (flag) {System.out.println(getName() + " flag:" + flag);while (!flag[0].equals("false")) {System.out.println(getName() + " begin waiting!");long waitTime = System.currentTimeMillis();try {flag.wait();} catch (InterruptedException e) {e.printStackTrace();}waitTime = System.currentTimeMillis() - waitTime;System.out.println("wait time :" + waitTime);}System.out.println(getName() + " end waiting!");}System.out.println(getName() + " end waiting!");}}public static void main(String[] args) throws InterruptedException {System.out.println("Main Thread Run!");NotifyTest test = new NotifyTest();NotifyThread notifyThread = test.new NotifyThread("notify01");WaitThread waitThread01 = test.new WaitThread("waiter01");WaitThread waitThread02 = test.new WaitThread("waiter02");WaitThread waitThread03 = test.new WaitThread("waiter03");notifyThread.start();waitThread01.start();waitThread02.start();waitThread03.start();}
}
结果:
Main Thread Run!
waiter01 flag:[Ljava.lang.String;@584aceca
waiter01 flag:[Ljava.lang.String;@584aceca
waiter02 flag:[Ljava.lang.String;@584aceca
waiter01 begin waiting!
waiter02 flag:[Ljava.lang.String;@584aceca
waiter02 begin waiting!
waiter03 flag:[Ljava.lang.String;@584aceca
waiter03 flag:[Ljava.lang.String;@584aceca
waiter03 begin waiting!
wait time :3000
waiter03 end waiting!
waiter03 end waiting!
wait time :3001
waiter02 end waiting!
waiter02 end waiting!
wait time :3001
waiter01 end waiting!
waiter01 end waiting!
Java之notify和notifyAll区别相关推荐
- Java中notify和notifyAll的区别 - 何时以及如何使用
Java notify vs notifyAll notify和notifyAll方法之间有什么区别是棘手的Java问题之一! Condition 是个什么玩意? 提几个问题,从问题中去了解去学 ...
- notify和notifyAll区别
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法.两者的最大区别在于: notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状 ...
- wait, notify 和 notifyAll区别
今天正好碰到这个问题,也疑惑了好久.看了一圈知乎上的答案,感觉没说到根上.所以自己又好好Google了一下,终于找到了让自己信服的解释. 先说两个概念:锁池和等待池 锁池:假设线程A已经拥有了某个对象 ...
- Java中notify() 和 notifyAll()的区别
等待池:假设一个线程A调用了某个对象的wait()方法,线程A就会释放该对象的锁后,进入到了该对象的等待池,等待池中的线程不会去竞争该对象的锁. 锁池:只有获取了对象的锁,线程才能执行对象的 sync ...
- Java 中 notify 和 notifyAll 有什么区别?
notify() 方法不能唤醒某个具体的线程,所以只有一个线程在等待的时候它才有 用武之地.而 notifyAll()唤醒所有线程并允许他们争夺锁确保了至少有一个线程 能继续运行.
- Java多线程——notify()与notifyAll()的区别
notify(): 唤醒在此对象监视器上等待的单个线程.如果所有线程都在此对象上等待,则会选择唤醒其中一个线程.选择是任意性的,并在对实现做出决定时发生.线程通过调用其中一个 wait 方法,在对象的 ...
- notify() 和notifyAll()区别
引用网上的例子,在明知到生产者 一个生产者,几个抢食者,如果通知所有的抢食者执行的操作会发生异常的时候,使用notify import java.util.ArrayList; import java ...
- notify()和notifyAll()区别
在同步块中调用了wait()会自动的释放该共享资源的锁,然后从运行状态中退出进入等待队列,直到再次被唤醒. 先来了解notify()的作用 该方法可以随机的唤醒等待队列中等待同一个共享资源的一个线程, ...
- notify()和 notifyAll()区别
1.调用notifyAll()会唤醒所有的线程:调用notify()唤醒一个线程. 2.调用notifyAll() 会将全部线程由等待池移到锁池,然后参与锁的竞争,竞争成功则继续执行:如果不成功,则留 ...
最新文章
- php链表笔记:单链表反转
- Cell子刊:中科院遗传发育所周俭民组发现特异靶向病原菌致病力的植物天然产物并阐明作用机制
- Java反射在整个程序运行中的位置
- 一句话搞定python六剑客
- 软银宣布启动5G Project:全球首家商用Massive MIMO技术
- centos 安装mysql
- LBO验证与LBO_full验证的区别
- MyBatis教程– CRUD操作和映射关系–第2部分
- 汉中计算机培训班学费是多少,汉中远程教育培训班收费多少
- UWP开发入门教程备忘
- 简要描述内部连接和外部连接之间的区别_创新性的M12推拉式连接器推拉标准—跨制造商自动化技术的里程碑...
- This function has none of DETERMINISTIC, NO SQL解决办法
- 技术影响力和开发者生态如何打造?
- 谈谈一些有趣的CSS题目(十二)-- 你该知道的字体 font-family
- 【第四次JAVA课,java语法基础】课件总结
- 最近,华为应用市场上线了一个服务
- 页面回发(PostBack)后,滚动条位置保持不变
- 专业测试工程师浅谈功能测试用例模板设计
- 比夏洛克还厉害:人工智能开始协助警方破案
- 蠕虫病毒Synaptics.exe感染日记