写一个简单的死锁 多线程编程

本文详细探讨了死锁在Java中如何由于资源限制、进程顺序和资源分配不当导致。通过A、B类的同步代码,展示了死锁发生的四个条件:互斥、请求保持、不可剥夺和循环等待。实例演示了如何在主线程与副线程中触发死锁现象。
摘要由CSDN通过智能技术生成

死锁发生的原因:

1、系统资源有限

2、进程或线程推进顺序不恰当

3、资源分配不当

死锁发生的四个条件:

1、互斥条件:一份资源每次只能被一个进程或线程使用(在Java中一般体现为,一个对象锁只能被一个线程持有)

2、请求与保持条件:一个进程或线程在等待请求资源被释放时,不释放已占有资源

3、不可剥夺条件:一个进程或线程已经获得的资源不能被其他进程或线程强行剥夺

4、循环等待条件:形成一种循环等待的场景

下面看代码:


public class A {
    public synchronized void waitMethod(B b) throws InterruptedException{
        System.out.println(Thread.currentThread().getName() + ":正在执行a的等待方法,持有a的对象锁");
        Thread.sleep(2000L);
        System.out.println(Thread.currentThread().getName() + ":试图调用b的死锁方法,尝试获取b的对象锁");
        b.deadLockMethod();
    }
    
    public synchronized void deadLockMethod(){
        System.out.println(Thread.currentThread().getName() + ":正在执行a的死锁方法,持有a的对象锁");
    }
}
public class B {
    public synchronized void waitMethod(A a) throws InterruptedException{
        System.out.println(Thread.currentThread().getName() + ":正在执行b的等待方法,持有b的对象锁");
        Thread.sleep(2000L);
        System.out.println(Thread.currentThread().getName() + ":试图调用a的死锁方法,尝试获取a的对象锁");
        a.deadLockMethod();
    }
    
    public synchronized void deadLockMethod(){
        System.out.println(Thread.currentThread().getName() + ":正在执行B的死锁方法,持有B的对象锁");
    }
}
public class TestDeadLock implements Runnable {
 
    A a = new A();
    B b = new B();
    
    public void init() throws InterruptedException{
        Thread.currentThread().setName("主线程");
        a.waitMethod(b);
    }
    
    @Override
    public void run() {
        Thread.currentThread().setName("副线程");
        try {
            b.waitMethod(a);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
    
    public static void main(String[] args) throws InterruptedException{
        TestDeadLock testDeadLock = new TestDeadLock();
        Thread thread = new Thread(testDeadLock);
        thread.start();    
        testDeadLock.init();
    }
}
通过sleep()方法,可以实现主线程持有a的对象锁并请求b的对象锁、 副线程持有b的对象锁并请求a的对象锁的场景,即发生死锁。
效果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值