多线程之死锁案例

本文例子和概念是参考《java多线程编程核心技术》---高洪岩

以前看多线程的书籍,对死锁是早有耳闻,基本概念是知道一些,但发现用代码表达的时候,不是很彻底,所以回过头来,翻书再巩固一番,并记录在此。
一、 首先为什么会产生死锁
个人理解 如果一个线程已经获取了A锁,同时还想去获取B锁,但恰恰 另一个线程已经获取B锁,同时也要去获取A锁,这样两个线程互相等待对方释放锁,就形成了死锁。
以下是产生死锁的一个例子:

public class DeadLock implements Runnable{

    public boolean flag = true;
    static Object o1 = new Object();
    static Object o2 = new Object();

    @Override
    public void run() {
        if (flag){
            synchronized(o1){
                System.out.println(Thread.currentThread().getName()+"01开始输出,等待o2输出!");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println(Thread.currentThread().getName()+"o2开始输出!");
                }
            }
        }else {
            synchronized(o2){
                System.out.println(Thread.currentThread().getName()+"02开始输出,等待o1输出!");
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println(Thread.currentThread().getName()+"o1开始输出!");
                }
            }
        }

    }
}

测试类

public class Test {

    public static void main(String[] args) throws Exception{
        DeadLock deadLock = new DeadLock();
        deadLock.flag = true;
        Thread t1 = new Thread(deadLock);
        t1.start();
        Thread.sleep(100);
        deadLock.flag = false;
        Thread t2 = new Thread(deadLock);
        t2.start();
    }
}

控制台输出
这里写图片描述

发布了11 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/love_gzd/article/details/82461311