面向面试的死锁问题

先看代码在做解释

public class DeadLock implements Runnable{
    String a;
    String b;
    boolean flag;
    public DeadLock(String a,String b,boolean flag){
        this.a=a;
        this.b=b;
        this.flag=flag;
    }
    public void run(){
        if(flag){
//          while(true){
                    synchronized(a){
                        System.out.println("锁a");
                        synchronized(b){
                            System.out.println("锁b----");
                        }
                    }
//              }
        }else{
//      while(true){
                synchronized(b){
                    System.out.println("锁b");
                    synchronized(a){
                        System.out.println("锁a----");
                    }
                }
//          }
        }
    }

    public static void main(String[] args){
    String a=new String("a");
    String b=new String("b");
    DeadLock d1=new DeadLock(a,b,true);
    DeadLock d2=new DeadLock(a,b,false);
    Thread t1=new Thread(d1);
    Thread t2=new Thread(d2);
    t1.start();
    t2.start();
    System.out.println("欢声笑语中打出GG");
    }

}

以上是代码部分,如果没有死锁,可以在if下加while(true),必然死锁,下面来做说明,
这个仅仅是为了理解死锁和面试用的,创建两个对象a和b只是为了作为死锁的对象而用,线程t1运行(t1.start()),线程t1拿到锁a后,需要继续执行,拿到锁b,而线程t2运行(t2.start()),拿到锁b,想继续拿到锁a继续执行,这就形成死锁,互相持有对面所需要的锁对象。如果面试,可以简单记下,两个线程,两个锁对象,锁互相嵌套,最少两种状态,同时执行,一次不行就多次,也可锁外面加循环,让线程多次运行,就会死锁,因为运行一次,可能存在偶然,第一个线程执行完了,锁对象释放了,第二个线程才进来执行,如此就有偶然现象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值