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();}}}}}}


原创粉丝点击