单生产单消费多生产多消费问题的解决及使用机制
2014-05-24 10:52
225 查看
wait:等待,释放锁。
notify:唤醒多个等待中的某一个,仅唤醒一个
notifyAll:唤醒所有的等待
使用任务协作的时候,都是用wait和notify或notifyAll技术解决。
1.论"单生产、单消费"
纯粹的使用wait和notify,会进入死锁状态。
死锁:都进入等待,没人唤醒
即:有线程甲、乙,甲进入等待,需要乙的唤醒;由于使用wait和notify的格式
对象.wait();
对象.notify();
即必须先执行唤醒语句,再来执行等待语句。这里的解决方案:
if(flag==false){
对象.wait();
}
flag=true;
对象.notify();
2.论“多生产、多消费”
有多个等待,notify只能唤醒某一个,而需求是:唤醒所有的等待。
为什么是唤醒所有的等待?
这里假设:2个生产者(t1,t2)和2个消费者(t3,t4),t1,t2,t3,都等待,假设t4唤醒了t3,那么消费者t3又消费了一次。这会造成多次消费
if(flag==false){ A
对象.wait(); B t1,t2
} C
flag=true; D
对象.notifyAll(); E
现在,假设t3唤醒t1和t2,t1进行生产,直至等待;由于t2也是被唤醒的,所以直接执行D处的代码。这就是漏洞了。
理想的情况下:t1进入等待的时候,由于flag为true,t2也应该被等待。这里就值得思考了,
根据
if(条件表达式){代码快}
只要执行完代码块就会往下执行代码
而我们想要在执行完代码块的时候还要去执行条件表达式,是不是想到了循环,有for和while,这里使用while
while(条件表达式){ A
对象.wait(); B t1,t2
} C
flag=true; D
对象.notifyAll(); E
notify:唤醒多个等待中的某一个,仅唤醒一个
notifyAll:唤醒所有的等待
使用任务协作的时候,都是用wait和notify或notifyAll技术解决。
1.论"单生产、单消费"
纯粹的使用wait和notify,会进入死锁状态。
死锁:都进入等待,没人唤醒
即:有线程甲、乙,甲进入等待,需要乙的唤醒;由于使用wait和notify的格式
对象.wait();
对象.notify();
即必须先执行唤醒语句,再来执行等待语句。这里的解决方案:
if(flag==false){
对象.wait();
}
flag=true;
对象.notify();
2.论“多生产、多消费”
有多个等待,notify只能唤醒某一个,而需求是:唤醒所有的等待。
为什么是唤醒所有的等待?
这里假设:2个生产者(t1,t2)和2个消费者(t3,t4),t1,t2,t3,都等待,假设t4唤醒了t3,那么消费者t3又消费了一次。这会造成多次消费
if(flag==false){ A
对象.wait(); B t1,t2
} C
flag=true; D
对象.notifyAll(); E
现在,假设t3唤醒t1和t2,t1进行生产,直至等待;由于t2也是被唤醒的,所以直接执行D处的代码。这就是漏洞了。
理想的情况下:t1进入等待的时候,由于flag为true,t2也应该被等待。这里就值得思考了,
根据
if(条件表达式){代码快}
只要执行完代码块就会往下执行代码
而我们想要在执行完代码块的时候还要去执行条件表达式,是不是想到了循环,有for和while,这里使用while
while(条件表达式){ A
对象.wait(); B t1,t2
} C
flag=true; D
对象.notifyAll(); E
相关文章推荐
- 在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。
- 使用ping机制解决原创文章被高权重采集网站优先收录问题
- 生产环境使用elasticsearch遇到的一些问题以及解决方法
- ASP.NET 计划任务,使用.net内部机制,解决应用池回收问题
- java信号量解决生产消费问题
- 使用Windbg找出死锁,解决生产环境中运行的软件不响应请求的问题
- 多线程多生产多消费问题以及解决
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- 生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)
- Java多线程的单生产单消费和多生产多消费问题的解决
- 生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)
- 使用双分派解决领域实体和外部机制通信问题
- 使用Lock与ReentrantLock模拟消息队列阻塞,生产与消费问题模拟
- Windows线程(六)使用事件机制解决线程同步问题
- 使用Lock锁机制实现 多线程的 多生产 多消费 模式。
- 生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)
- 生产环境使用elasticsearch遇到的一些问题以及解决方法(不断更新)
- 使用租约机制解决缓存数据更新的问题
- 理解B/S结构中服务端同步与异步机制的区别,通过使用ASP.Net异步处理节约队列时间成本,解决大并发量问题
- 使用IntentService解决点我达骑手APP消息提醒机制中的优先级排序问题