多线程(五)——多线程安问题之死锁(Dead Lock )
2013-07-04 09:46
302 查看
死锁产生的原因是多个线程在同步(synchronized)中使用不同的锁,因而线程都因相互抢夺CPU资源而挂起,即产生死锁,以下是代码示例:
例程1:
下面的代码中因为同步相互嵌套,在同步函数和同步代码块中相互调用,前者的锁是className.class字节码文件,后者的锁是this Lock ,故死锁发生;
例程2:
下面的代码在MyLock 中一开始就new了两个锁,故而必然挂起;
了解了死锁的产生原理,对于防止死锁的发生就很容易了,结合同步的几个原则:
1、保证有两个及以上的线程(否则就是单线程了,没有讨论意义);
2、确保多个线程共用一个锁(很关键的);
当然,在JKD1.5以后,同步会被Condition取代,这会在后续再谈。
例程1:
下面的代码中因为同步相互嵌套,在同步函数和同步代码块中相互调用,前者的锁是className.class字节码文件,后者的锁是this Lock ,故死锁发生;
/* @author Kallen Ding */ class Ticket implements Runnable { private int tick = 1000; Object obj = new Object(); boolean flag = true; public void run() { if(flag) { while(true) { synchronized(obj) { show(); } } } else while(true) { show(); } } public synchronized void show() { synchronized(obj) { if(tick>0) { try{Thread.sleep(10);} catch(Exception e){} System.out.println( Thread.currentThread(). getName()+"------SyncCodes:" +tick--); } } } } class DeadLockDemo { public static void main(String[] args) { Ticket t = new Ticket(); Thread t1 = new Thread(t); Thread t2 = new Thread(t); t1.start(); try{Thread.sleep(10);} catch(Exception e){} t.flag = false; t2.start(); } }
例程2:
下面的代码在MyLock 中一开始就new了两个锁,故而必然挂起;
class Test implements Runnable { private boolean flag; Test(boolean flag) { this.flag = flag; } public void run() { if(flag) { while(true) { synchronized(MyLock.lock_a) { System.out.println("if----lock_a"); synchronized(MyLock.lock_b) { System.out.println("if----lock_b"); } } } } else { while(true) { synchronized(MyLock.lock_b) { System.out.println("else----lock_b"); synchronized(MyLock.lock_a) { System.out.println("else----lock_a"); } } } } } } class MyLock { static Object lock_a = new Object(); static Object lock_b = 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(); } }
了解了死锁的产生原理,对于防止死锁的发生就很容易了,结合同步的几个原则:
1、保证有两个及以上的线程(否则就是单线程了,没有讨论意义);
2、确保多个线程共用一个锁(很关键的);
当然,在JKD1.5以后,同步会被Condition取代,这会在后续再谈。
相关文章推荐
- 记录一次多线程死锁的问题
- 多线程总结2(死锁等问题)
- java例程练习(多线程[死锁问题])
- 19-多线程(验证同步函数的锁) 21-多线程(单例模式涉及的多线程问题) 1 2 22-多线程(死锁示例) 23-Objcet放的位置产生的问题
- 多线程死锁问题
- JAVA基础再回首(二十五)——Lock锁的使用、死锁问题、多线程生产者和消费者、线程池、匿名内部类使用多线程、定时器、面试题
- 多线程死锁问题
- 多线程编程之线程死锁问题
- 多线程死锁问题
- web开发中的多线程死锁问题,避免死锁
- java例程练习(多线程[死锁问题])
- 多线程编程之线程死锁问题 转载
- 多线程问题--- 死锁
- 多线程死锁问题
- 多线程——用Lock(锁)和Condition(监听器)来优化生产者消费者模式(进一步优化,解决可能产生的死锁问题)
- java 多线程 死锁 哲学家就餐问题
- java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)
- 黑马程序员:Java基础——多线程的死锁问题
- 【面试系列】哲学家就餐问题(3个)--多线程,防死锁
- 多线程死锁问题