java一段死锁的代码

死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。

public class ShareObject1 {}
public class ShareObject2 {}
public class Thread1 extends Thread {
    @Override
    public void run() {
        synchronized (ShareObject1.class) {
            System.out.println("线程1获取到 ShareObject1 的锁");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (ShareObject2.class) {
                System.out.println("线程1获取到 ShareObject2 的锁");
            }
        }
    }
}
public class Thread2 extends Thread {
    @Override
    public void run() {
        synchronized (ShareObject2.class) {
            System.out.println("线程2获取到 ShareObject2 的锁");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (ShareObject1.class) {
                System.out.println("线程2获取到 ShareObject1 的锁");
            }
        }
    }
}
public class Test {

    public static void main(String[] args) {
        new Thread1().start();
        new Thread2().start();
    }
}

运行main得到如下结果:

在上述代码中,线程Thread1首先获取到ShareObjectl的锁,然后再去尝试获取ShareObject2的锁:此时线程Thread2已经获取到ShareObject2的锁,继续尝试去获取ShareObject1的锁。这样两个线程都需要得到对方已经占有的资源后才能继续运行,因此,会导致死锁。造成死锁的主要原因是两个线程请求资源的顺序不合理,如果这两个线程采用同样的顺序获取,那么就不会出现死锁。

参考文献:《Java程序员面试笔试真题与解析》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章