多线程与死锁

死锁

    死锁发生的情况:创建两个字节数组LockA和LockB,再创建两个线程A和B,让每个线程都用synchronized锁住字节数组(A先锁LockA,再尝试去锁定LockB;B先锁LockB,再尝试锁定锁定LockA),如果A锁住LockA,B锁住LockB,A就没办法锁住LockB,B也没办法锁住LockB,两者相互等待,这时就陷入了死锁。


代码示例
package cn.edu.pzhu;

public class DeadLock {
    //这种定义从一个大佬那儿学的
    public static byte LockA[] = new byte[0];
    public static byte LockB[] = new byte[0];

    public static void main(String[] args) {
        new Thread(new A()).start();
        new Thread(new B()).start();
    }
}

class A implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("A 准备锁定 LockA");
            synchronized (DeadLock.LockA) {
                System.out.println("A 把 LockA 锁定");
                Thread.sleep(1000); // 让A等一会,让B有时间锁定LockB
                System.out.println("A 尝试锁定 LockB");
                synchronized (DeadLock.LockB) {
                    System.out.println("A 把LockB锁定");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("A的锁释放");
    }
}

class B implements Runnable {
    @Override
    public void run() {
        try {
            System.out.println("LockB 准备锁定");
            synchronized (DeadLock.LockB) {
                System.out.println("B 把 LockB 锁定");
                System.out.println("B 尝试锁定 LockA");
                synchronized (DeadLock.LockA) {
                    System.out.println("B 把 LockA 锁定 ");
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("B的锁释放");
    }
}
运行结果

运行结果

如有不当之处欢迎指出!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值