Java 多线程 死锁

 

线程死锁代码的实现

public class LockA {
    //不同的线程争抢同一个锁,只有一个锁对象   ===> 被争抢的锁对象 应该具有唯一性!
    //私有的构造器,  在此类外部无法任何类都无法new该类的对象
    private LockA(){}    
    //外类不能new   本类内部自己new  
    //LockA locka = new LockA();   //当前 该对象目前为 非静态     
    //new出的对象   还需要能被外类使用  非静态 只能通过new对象  对象. 的方式来调用
    //只用添加static修饰  改用 类名. 方式来调用     
    //防止被改  再添加 final修饰
    public  static final LockA locka = new LockA();
    
}
public class LockB {

    private LockB(){}    
    public static final LockB lockb = new LockB();

}

 

public class DeadLock implements Runnable{
    private int i = 0;
    public void run(){
        while(true){
            //利用奇数偶数  让两个线程执行不同   一个先拿A锁 再拿B锁    一个先拿B锁 再拿A锁
            if(i%2==0){
                //先进入A同步,再进入B同步
                synchronized(LockA.locka){
                    System.out.println("if...locka");
                    synchronized(LockB.lockb){
                        System.out.println("if...lockb");
                    }
                }
            }else{
                //先进入B同步,再进入A同步
                synchronized(LockB.lockb){
                    System.out.println("else...lockb");
                    synchronized(LockA.locka){
                        System.out.println("else...locka");
                    }
                }
            }
            i++;
        }
    }
}
public class DeadLockDemo {
    public static void main(String[] args) {
        DeadLock dead = new DeadLock();
        Thread t0 = new Thread(dead);
        Thread t1 = new Thread(dead);
        t0.start();
        t1.start();
    }
}

 

posted @ 2020-05-29 11:22  CherryYang  阅读(139)  评论(0)    收藏  举报