多线程_死锁
第一部分
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,同步函数用的锁是this synchronized(obj) { show(); } } else while(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、运行结果
两者都拿着锁都不放,最后就锁住了;要避免死锁的发生;
第三部分
我的总结
|--死锁的发生就是两个程序都拿着自己的锁,想要进入到对方的锁中,但是两者都是拿着锁不放,相持不下,最后就锁住了;|--写程序时要避免死锁的发生;|--死锁在面试的时候,会要求让你写一个死锁出来;