黑马程序员_多线程(死锁)

来源:互联网 发布:exchange 587端口 编辑:程序博客网 时间:2024/06/04 18:50

------- android培训、java培训、期待与您交流! ----------

多线程_死锁

第一部分

1、死锁的描述

|--你持有一个锁,我也持有一个锁,我要到你的里面去运行,我就要拿到你的锁,而你要到我的里面的来运行,你也要向我要锁,我不放我的锁,我要进你的里面去,你不放你的锁,你要到我的里面来,谁都不放,相持不下,这样就导致了死锁的发生;这个现象就导致了程序就挂那边不动了,
|--举例:你有一个筷子,我也有一根筷子,我说把你的筷子给我,我要吃饭,但是这是你也说让我把我的筷子给你,你也要吃饭,但是你不放你的筷子,我也不放我的这根筷子,咱们相持不下,谁都不要吃饭;

2、死锁的出现

|--通常死锁的出现都是同步中嵌套同步
|--要让一个同步函数进入到同步代码快里面,让一个同步代码快进入到一个同步函数里面;

3、死锁代码体现

class Ticket implements Runnable{private int tick =800;Object obj = new Object();boolean flag = true;public void run(){if(flag)while(true){//同步代码块里面有同步函数,同步代码快用的锁是obj,同步函数用的锁是thissynchronized(obj){show();}}elsewhile(true)show();}//同步函数里面有同步代码块,this锁里面有obj锁public synchronized void show(){synchronized(obj){if(tick>0){try{Thread.sleep(10);}catch (Exception e){System.out.println(e.toString());}System.out.println(Thread.currentThread().getName()+"--code--"+tick--);}}}}class DeadLockDemo{public static void main(String[] args) {Ticket t = new Ticket();Thread t1 = new Thread(t);Thread t2 = new Thread(t);//Thread t3 = new Thread(t);//Thread t4 = new Thread(t);t1.start();try{Thread.sleep(10);}catch (Exception e){System.out.println(e.toString());}t.flag =false;t2.start();//t3.start();//t4.start();}}

4、运行结果



第二部分

1、死锁程序

这个程序是a拿着a锁想要进b里面去,b拿着b的锁想要进a来,两者都拿着锁不放,都相持不下;
<span style="font-size:14px;">//面试时要写一个死锁</span><span style="font-size:18px;">class Test implements Runnable{private boolean flag;Test(boolean flag){this.flag = flag;}public void run(){if(flag){//用的是两个同步代码快,进行的验证,a锁里面有b锁,synchronized(MyLock.locka){System.out.println("if locka");synchronized(MyLock.lockb){System.out.println("if lockb");}}}else{//用的是两个同步代码块,b锁里面有a锁;synchronized(MyLock.lockb){System.out.println("else lockb");synchronized(MyLock.locka){System.out.println("else locka");}}}}}class MyLock{//静态直接有类名进行调用static Object locka = new Object();static Object lockb = new Object();}class DeadLockTest {public static void main(String[] args) {Thread t1 = new Thread(new Test(true));Thread t2 = new Thread(new Test(false));t1.start();t2.start();}}</span>

2、运行结果



两者都拿着锁都不放,最后就锁住了;
要避免死锁的发生;

第三部分

我的总结

|--死锁的发生就是两个程序都拿着自己的锁,想要进入到对方的锁中,但是两者都是拿着锁不放,相持不下,最后就锁住了;
|--写程序时要避免死锁的发生;
|--死锁在面试的时候,会要求让你写一个死锁出来;









0 0
原创粉丝点击