Java 杂谈程序猿阵线联盟-汇总各类技术干货

剖析Java中死锁的原因以及实现

2019-03-27  本文已影响11人  Java酸不酸

死锁的原因

首先,产生死锁需要两个锁对象(假设A,B),两个线程同时运行,并使用两个锁对象。简单的说就是锁A等待锁B释放,而锁B等待锁A释放,这样就产生了所谓的死锁。当然产生死锁的机率并不是100%,而是有一定的机率;原因是CPU在线程之间切换是没有规律的,所以产生死锁,具体看CPU的调度。请看下面实现代码,再进一步剖析:

public class DieLock {
    public static final Object LOCK_A = new Object();
    public static final Object LOCK_B = new Object();

    public static void main(String[] args) {
        // 线程一
        new Thread(() ->{
            System.out.println("Thread a starter");
            synchronized (LOCK_A) {
                System.out.println("Thread a: into lock a!");
                synchronized (LOCK_B) {
                    System.out.println("Thread a: into lock b!");
                }
                System.out.println("Thread a: release lock b!");
            }
            System.out.println("Thread a: release lock a!");
        }).start();

        // 线程二
        new Thread(() ->{
            System.out.println("Thread b starter");
            synchronized (LOCK_B) {
                System.out.println("Thread b: into lock b!");
                synchronized (LOCK_A) {
                    System.out.println("Thread b: into lock a!");
                }
                System.out.println("Thread b: release lock a!");
            }
            System.out.println("Thread b: release lock b!");
        }).start();
    }
}

分析

上一篇 下一篇

猜你喜欢

热点阅读