Java多线程并发环境下的synchronized死锁实例

Java多线程并发环境下的synchronized死锁实例

Java并发多线程环境中,造成死锁的最简单的场景是:多线程中的一个线程T_A持有锁L1并且申请试图获得锁L2;而多线程中另外一个线程T_B持有锁L2并且试图申请获得锁L1。线程的锁申请操作是阻塞的,于是造成线程T_A和线程T_B无法正确获得想要的锁,两个线程被阻塞进入死锁状态。

例如:

public class MainClass {
    private Object lock1 = new Object();

    private Object lock2 = new Object();

    public static void main(String[] args) {
        MainClass mainClass = new MainClass();
        mainClass.demo();
    }

    private void demo() {
        Thread ta = new Thread(new DeadA());
        Thread tb = new Thread(new DeadB());
        ta.start();
        tb.start();
    }

    private class DeadA implements Runnable {
        private String id = "A";

        @Override
        public void run() {
            System.out.println(id + " 申请锁1...");
            synchronized (lock1) {
                System.out.println(id + " 获得锁1");

                System.out.println(id + " 申请锁2...");
                synchronized (lock2) {
                    //A得不到锁2,死锁
                    System.out.println(id + "获得锁2");
                }
            }

            System.out.println(id + " 运行结束");
        }
    }

    private class DeadB implements Runnable {
        private String id = "B";

        @Override
        public void run() {
            System.out.println(id + " 申请锁2...");
            synchronized (lock2) {
                System.out.println(id + " 获得锁2");

                System.out.println(id + " 申请锁1...");
                synchronized (lock1) {
                    //B得不到锁1,死锁
                    System.out.println(id + " 获得锁1");
                }
            }

            System.out.println(id + " 运行结束");
        }
    }
}

输出:

B 申请锁2...
A 申请锁1...
B 获得锁2
A 获得锁1
B 申请锁1...
A 申请锁2...

Java同步机制:synchronized,wait,notify_zhangphil的博客-CSDN博客/** * 假设A,B两个线程同时运行。但A需要某项前置条件必须满足(data数组装满)后才可以正常运转。 这里让B线程去为满足A的条件去干活。 */public class SYN {int[] data = new int[100];final Object lock = new Object();public SYN() {new Thread(new A())https://blog.csdn.net/zhangphil/article/details/43800949

Java线程同步synchronized wait notifyAll_zhangphil的博客-CSDN博客public class Main { public static void main(String[] args) { Main main = new Main(); main.test(); } private void test() { new Thread(new Runnable() { ...https://blog.csdn.net/zhangphil/article/details/96439409

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangphil

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值