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

多线程与死锁

程序员文章站 2022-04-17 14:05:24
...

死锁

    死锁发生的情况:创建两个字节数组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的锁释放");
    }
}

运行结果

多线程与死锁

如有不当之处欢迎指出!

相关标签: 多线程 死锁