Java多线程技术初识——5. 死锁

来源:互联网 发布:日本买房知乎 编辑:程序博客网 时间:2024/05/19 15:41

死锁:

指多个进程or 线程在运行过程中因争夺资源而造成的一种僵局,当线程 处于 这种僵态是,若无外力作用,他们将无法再向前推进。

最常见的死锁情况,同步的嵌套:

同步中还有同步,两个同步用的不是一个锁。

 我们应当,尽量避免同步嵌套的情况。

如下所示:

public class Clock {public static Clock locka = new Clock();public static Clock lockb = new Clock();}public class DeadLock implements Runnable {private boolean flag;public DeadLock(boolean flag){this.flag = flag;}@Overridepublic void run() {if(flag){while(true){synchronized(Clock.locka){System.out.println(".................if locka");synchronized(Clock.lockb){System.out.println(".................if lockb");}}}}else{while(true){synchronized(Clock.lockb){System.out.println("-------------------------else lockb");synchronized(Clock.locka){System.out.println("----------------------else locka");}}}}}}public class DeadLockTest {public static void main(String[] args) {DeadLock d1 = new DeadLock(true);DeadLock d2 = new DeadLock(false);Thread t1 = new Thread(d1);Thread t2 = new Thread(d2);t1.start();t2.start();}}

上例中,当先线程1 拿到 Clock.locka , 线程2 拿到 Clock.lockb, 但 此时,线程1 需要 Clock.lockb 来继续运行,线程2 需要 Clock.locka 来继续运行,他们互不想让,就造成了死锁的状况。