死锁产生的原因和避免死锁的方法

出现死锁的情况

线程t1拿到锁因为一些异常没有释放锁,线程t1和t2互相等待对方释放锁。

public class DeadLockDemo {
    
    
    private static String A="A";
    private static String B="B";
    public static void main(String[] args) {
    
    
        new DeadLockDemo().deadLock();
    }
    private void deadLock(){
    
    
        Thread t1=new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                synchronized (A){
    
    
                    try {
    
    
                        Thread.currentThread().sleep(2000);
                    } catch (InterruptedException e) {
    
    
                        e.printStackTrace();
                    }
                    synchronized (B){
    
    
                        System.out.println("1");
                    }
                }
            }
        });
        Thread t2=new Thread(new Runnable() {
    
    
            @Override
            public void run() {
    
    
                synchronized (B){
    
    
                    synchronized (A){
    
    
                        System.out.println("2");
                    }
                }
            }
        });
        t1.start();
        t2.start();
    }
}

避免死锁的常见方法

  1. 避免一个线程同时获取多个锁。
  2. 避免一个线程在锁内同时占用多个资源,尽量保证每个锁只占用同一个资源。
  3. 尝试使用定时锁,使用lock.tryLock(timout)来替代使用内部锁机制。
  4. 对于数据库锁,加锁和解锁必须在同一个数据库里,否则会出现解锁失败的情况。

猜你喜欢

转载自blog.csdn.net/weixin_44146509/article/details/108775306
今日推荐