欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java一段死锁的代码

程序员文章站 2022-07-15 15:26:40
...

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

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得到如下结果:

java一段死锁的代码

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

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

相关标签: Java