模拟线程死锁现象:两个线程同时抢两个互斥锁

下面业务逻辑的分析
1.如果 flag 为 T,线程 A 就会先得到 / 持有 o1 对象锁,然后尝试去获取 o2 对象锁
2.如果线程 A 得不到 o2 对象锁,就会 Blocked
3.如果 flag 为 F ,线程 B 就会先得到 / 持有 o2 对象锁,然后尝试去获取 o1 对象锁
4.如果线程 B 得不到 o1 的对象锁。就会 Blocked

public static void main(String[] args) {
        //模拟死锁现象
        DeadLockDemo A = new DeadLockDemo(true);
        DeadLockDemo B = new DeadLockDemo(false);
        A.start();
        B.start();
    }
}

class DeadLockDemo extends Thread {
    static Object o1 = new Object();//保证多线程,共享一个对象,这里使用static
    static Object o2 = new Object();
    boolean flag;

    public DeadLockDemo(boolean flag) {//构造器
        this.flag = flag;
    }

    public void run() {
        /**下面业务逻辑的分析
         * 1.如果 flag 为 T,线程 A 就会先得到 / 持有 o1 对象锁,然后尝试去获取 o2 对象锁
         * 2.如果线程 A 得不到 o2 对象锁,就会 Blocked
         * 3.如果 flag 为 F ,线程 B 就会先得到 / 持有 o2 对象锁,然后尝试去获取 o1 对象锁
         * 4.如果线程 B 得不到 o1 的对象锁。就会 Blocked
         */
        if (flag) {
            synchronized (o1) {//对象互斥锁
                System.out.println(Thread.currentThread().getName() + "进入1");
                synchronized (o2) {//这里获得li对象的监视权
                    System.out.println(Thread.currentThread().getName() + "进入2");
                }
            }
        } else {
            synchronized (o2) {//
                System.out.println(Thread.currentThread().getName() + "进入3");
                synchronized (o1) {//这里获得li对象的监视权
                    System.out.println(Thread.currentThread().getName() + "进入4");
                }
            }
        }
    }
}

写代码的时候,一定要避免这种业务逻辑 

模拟线程死锁现象:两个线程同时抢两个互斥锁_第1张图片

你可能感兴趣的:(韩顺平java习题,java,开发语言)