多线程之死锁案例

本文例子和概念是参考《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();
    }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值