notify和notifyAll的不同

本文针对一个博客中关于同步机制的问题进行了讨论,特别是对于notify和notifyAll的使用时机提出了见解,并指出在特定代码结构下可能导致的问题及解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

粗略理解一下,其实不能算完全原创,是根据一个大哥的博客代码的一点理解。

http://www.cnblogs.com/armyao/archive/2010/12/27/1917989.html

这个是大哥的原帖,代码不重复引用,只介绍关键部分。


这句话我觉得大哥说的不太好,首先,决定notify和notifyall的不是这个5秒产生一个,即使不是5秒产生一个,理论上也有出问题的可能吧。原因下面说明


原因就在这个if

return写在 if外面后面,wait的时候,就等着remove了,那还不出错啊。

想用notifyall可以的,只要把if改成while就行了。


### Java `notify` vs `notifyAll` 方法区别 #### 一、方法概述 在Java中,`notify()``notifyAll()`都是用于线程间通信的方法,属于`Object`类的一部分。这两个方法的主要功能是在特定条件下唤醒等待该对象锁的线程。 - **`notify()`**: 只唤醒一个处于等待状态的线程(如果有),具体哪一个由JVM决定[^1]。 - **`notifyAll()`**: 唤醒所有处于等待状态的线程。所有被唤醒的线程都将进入锁池并尝试重新获得对象锁[^2]。 #### 二、主要差异 ##### 1. 唤醒线程的数量 最直观的区别在于两者所影响的线程数目: - `notify()`仅会选择单一线程进行唤醒操作; - 而`notifyAll()`则会对所有符合条件的线程发出信号[^3]。 ##### 2. 应用场景的选择 根据不同情况选择合适的方法至关重要: - 当确切知道只需要唤醒单一指定线程时,可优先考虑使用`notify()`来降低不必要的资源消耗; - 若存在多个线程依赖于同一条件变化,则应采用`notifyAll()`确保每一个受影响的线程都能接收到通知[^4]。 ##### 3. 对性能的影响 由于`notifyAll()`会一次性激活大量线程参与竞争,这可能会造成短暂时间内CPU利用率上升;相反地,`notify()`因为作用范围较小,在某些情况下有助于提高效率[^5]。 #### 三、代码示例 为了更好地理解这两种方法的应用方式,这里给出一段简单的生产者-消费者模型作为示范: ```java public class ProducerConsumerExample { private static final int CAPACITY = 5; private Queue<Integer> queue = new LinkedList<>(); public synchronized void produce(int value) throws InterruptedException { while (queue.size() >= CAPACITY) { wait(); // 如果队列已满,则让当前线程等待 } queue.add(value); System.out.println("Produced: " + value); notifyAll(); // 生产完成后通知所有等待中的消费线程 } public synchronized Integer consume() throws InterruptedException { while (queue.isEmpty()) { wait(); // 队列为空时使消费线程暂停 } Integer consumedValue = queue.poll(); System.out.println("Consumed: " + consumedValue); notifyAll(); // 消费后同样要告知其他可能存在的生产线程 return consumedValue; } } ``` 在这个例子中,每当有新的商品加入库存(`produce`)或是现有商品被取出(`consume`)之后都会调用`notifyAll()`去提醒那些正处于休眠状态下的对方角色(即生产消费),从而维持整个系统的正常运转。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值