Android-Java-死锁

死锁:程序不往下执行了,程序又没有结束,就一直卡在哪里;

在使用synchronized的时候要避免死锁,synchronized嵌套就可能会引发死锁,需要严格的检查代码,排除死锁发生的可能;

 

特意演示死锁的案例:synchronized嵌套,使用多把同步锁??

package android.java.thread15;/** * 定义死锁任务 */class DieLockThread extends Thread { /** * 此变量已经不是共享数据了,因为: * DieLockThread extends Thread * new DieLockThread().start(); * new DieLockThread().start(); * * 所以:Thread-0有自己的flag Thread-1也有自己的flag */ private boolean flag; public DieLockThread(boolean flag) { this.flag = flag; } @Override public void run() { int i = 0; int j = 0; if (flag) { while (true) { synchronized (Lock.LOCK1) // 使用第一把锁?? { synchronized (Lock.LOCK2) // 使用第二把锁?? { System.out.println("一一一一一一一一一一一一" + i++); } } } } else { while(true) { synchronized (Lock.LOCK2) // 使用第二把锁?? { synchronized (Lock.LOCK1) // 使用第一把锁?? { System.out.println("二二二二二二二二二二二二" + j++); } } } } }}/** * 定义两把锁?? */class Lock { public final static Object LOCK1 = new Object(); public final static Object LOCK2 = new Object();}public class DieLockDemo { public static void main(String[] args) { new DieLockThread(true).start(); new DieLockThread(false).start(); }}

 

死锁结果,程序一直卡住不动了,不往下执行了:

技术分享图片

 

分析死锁??:

if (flag) { while (true) { // 第一步:CPU随机性切换到:Thread-1 Thread-1正常往下走...... // 第六步:CPU随机性切换到:Thread-1 ,然后判断同步锁 注意:此时的同步锁??Lock == 第二把锁??, 第二把锁??是被Thread-1锁定的,就造成了线程之间不和谐:死锁 synchronized (Lock.LOCK1) // 使用第一把锁?? { synchronized (Lock.LOCK2) // 使用第二把锁?? { System.out.println("一一一一一一一一一一一一" + i++); // 第二步:CPU随机性切换到:Thread-1 就在此时,CPU执行权没有了, CPU去执行其他线程了  } } // 第四步: CPU随机性切换到:Thread-1 Thread-1正常往下走完,并解锁?? } } else { while(true) { // 第三步:CPU随机切换到:Thread-0,然后判断同步锁 注意:此时的同步锁??Lock == 第二把锁??, 第二把锁??是被Thread-1锁定的,就造成了线程之间不和谐:死锁 synchronized (Lock.LOCK2) // 使用第二把锁?? { synchronized (Lock.LOCK1) // 使用第一把锁?? { 第五步:CPU随机性切换到:Thread-0 就在此时,CPU执行权没有了, CPU去执行其他线程了 System.out.println("二二二二二二二二二二二二" + j++); } } } }

 

开发中,千万不能出现死锁;

出现死锁的原因有:多线程并发/多个地方调用 + synchronized(多把锁)

 

相关文章