JAVA--多线程中notify()造成的死锁原因的研究与使用
来源:互联网 发布:全自动猫厕所 知乎 编辑:程序博客网 时间:2024/05/16 10:34
JAVA--锁,时间片,多线程,同步锁之间的联系
概念
时间片:
时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。
锁:
java中对同步资源引入的一种管理机制即
宏观同步(同一时间发生,与java同步区别开来)
微观有序
联系:
时间片与锁并无绝对的联系时间片结束了
锁不一定释放锁释放了
时间片不一定结束
同步锁:
同步锁就是把特定的共享资源 先自己占有
外部禁止访问,自己执行完了,
才释放给予其他想拥有此锁的线程。
//下面代码造成死锁的原因就是notify是随意唤醒一个线程,唤醒的可能是功能相同的线程,而锁并不在唤醒的线程手里,就造成了死锁的产生,
notifyAll可以解决该死锁问题
public class threadd {public static void main(String[] args) {// TODO Auto-generated method stubMakeCake mc=new MakeCake();mc.setName("麦当劳1号");MakeCake mc2=new MakeCake();mc2.setName("麦当劳2号");EatCake ec=new EatCake();Cake c=new Cake();mc.cake=c;mc2.cake=c;ec.cake=c;mc.start();ec.start();mc2.start();}}class Cake{int num=0;boolean flag=false;}class MakeCake extends Thread{static Cake cake;public void run(){while(true){synchronized (cake) {if(!cake.flag){cake.num++;System.out.println(Thread.currentThread().getName()+"正在做了第"+cake.num+"个饼");try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName()+"做好了第"+cake.num+"个饼");cake.notify();//cake.notifyAll() 此处可以试试 notifyAll()cake.flag=true;}else{try {cake.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}}class EatCake extends Thread{static Cake cake;public void run(){while(true){synchronized (cake) {if(cake.flag){System.out.println("萌娃正在吃第"+cake.num+"个饼");try {Thread.sleep(100);} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println("萌娃吃完了第"+cake.num+"个饼");cake.notify();//cake.notifyAll() 此处可以试试 notifyAll()cake.flag=false;}else{try {cake.wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}}}}
阅读全文
0 0
- JAVA--多线程中notify()造成的死锁原因的研究与使用
- wait和notify造成死锁的例子
- spinlock造成死锁的原因
- 多线程造成死锁的例子
- java多线程synchronized的使用及死锁的造成和解锁
- Java多线程中wait, notify and notifyAll的使用
- Java多线程中wait, notify and notifyAll的使用
- Java多线程中wait, notify and notifyAll的使用
- Java 内部类,多线程中Synchronized与wait,notify的使用
- java多线程之wait,notify的使用
- 多线程造成死锁的两种情况
- java多线程使用不当造成的问题
- Java中wait与notify的正确使用
- Java多线程产生死锁的原因和解决方法
- Java多线程的同步与死锁
- Java多线程的死锁
- suspend造成死锁的例子和原因分析
- 造成数据库表死锁的原因分析及解决方案
- sublimetext3 快捷键
- 启动azkaban-web示例步骤
- 【LeetCode】599. Minimum Index Sum of Two Lists
- android 多版本打包后微信分享/登录授权失败问题
- 二、Matplotlib系列---pyplot的plot( )函数
- JAVA--多线程中notify()造成的死锁原因的研究与使用
- Python学习随笔七:高级特性
- C和C++中struct区别
- vi 切换
- WPF中绘图
- android 媒体框架学习--mediaplayerservice 关系类图
- opencv2.4.9 绘制一维直方图
- IGBT最不为人知的神秘损坏原因!
- 五笔字典编码-------------->_<