死锁问题

【死锁例子】

复制代码
public class Demo {
    public static void main(String[] args) {
        DeadLockThread dt1=new DeadLockThread(true);
        DeadLockThread dt2=new DeadLockThread(false);
        
        Thread t1=new Thread(dt1,"筷子线程");
        Thread t2=new Thread(dt2,"刀叉线程");
        
        t1.start();
        t2.start();
    }
}

class DeadLockThread implements Runnable{

    static Object chopsticks=new Object();  //筷子
    static Object knifeFork=new Object();   //刀叉
    private boolean flag;
    
    public DeadLockThread(boolean flag){
        this.flag=flag;
    }
    
    @Override
    public void run() {
        if(flag){   //如果为true,默认为筷子线程
            while(true){
                synchronized (chopsticks) {  
                    System.out.println(Thread.currentThread().getName()+"---if---chopsticks");
                    synchronized (knifeFork) {   //等待刀叉线程的锁释放
                        System.out.println(Thread.currentThread().getName()+"---if---knifefork");
                    }
                }
            }
        }else{    //如果为false,默认为刀叉线程
            while(true){
                synchronized (knifeFork) {
                    System.out.println(Thread.currentThread().getName()+"---else---knifefork");
                    synchronized (chopsticks) {  //等待筷子线程的锁释放
                        System.out.println(Thread.currentThread().getName()+"---else---chopsticks");
                    }
                }
            }
        }
    }
}
复制代码

【运行结果】

【分析】

创建两个线程"筷子线程"和"刀叉线程",flag值分别为true和false,分别执行run方法中的if和else的代码块,注意chopstickknifefork对象锁都是静态变量,所以两个线程中的static变量时一致的。当筷子线程拥有chopsticks锁,此时需要获得knifefork锁才能继续执行,而刀叉线程拥有knifefork锁,此时需要chopsticks锁才能继续执行,此时就陷入了一个矛盾,两个线程都需要对方占用的锁,但是都无法释放自己的锁,于是两个线程都处于了挂起状态,造成上面的死锁现象。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值