Discuss / Java / 解决死锁问题,同一个线程获取锁的顺序一致即可

解决死锁问题,同一个线程获取锁的顺序一致即可

Topic source
package main.java;public class KillLock {
    public static Object lockA =new Object();    public static Object lockB = new Object();    private int a=0;    private int b=0;    public void add(Object lockA,Object lockB) throws InterruptedException {
        synchronized(lockA){
            a = a+1;            Thread.sleep(1000);            synchronized(lockB){
                b = b+1;            }
        }
    }
    public void dec(Object lockA,Object lockB) throws InterruptedException {
//        synchronized(lockB){//            b = b-1;//            Thread.sleep(1000);//            synchronized(lockA){//                a = a-1;//            }//        }        synchronized(lockA){
            a = a-1;            Thread.sleep(1000);            synchronized(lockB){
                b = b-1;            }
        }
    }

    public int getA() {
        return a;    }

    public int getB() {
        return b;    }

    public static void main(String[] args) throws InterruptedException {
        KillLock killLock = new KillLock();        Thread t1 = new Thread(()->{
            try {
                killLock.add(KillLock.lockA,KillLock.lockB);            } catch (InterruptedException e) {
                throw new RuntimeException(e);            }
        });        Thread t2 = new Thread(()->{
            try {
                killLock.dec(KillLock.lockA,KillLock.lockB);            } catch (InterruptedException e) {
                throw new RuntimeException(e);            }
        });        t1.start();        t2.start();        t1.join();        t2.join();        System.out.println("a:"+killLock.getA()+",b:"+killLock.getB());    }
}

保持热爱

#2 Created at ... [Delete] [Delete and Lock User]

不只是同一个线程,是所有使用一组相同的锁的线程,获取锁的顺序要保持一致

保持热爱

#3 Created at ... [Delete] [Delete and Lock User]

顺序一致,只满足循环等待条件,而这并不能完全解决死锁问题,还有需要满足另外三种条件
1.互斥:同一时刻只能有一个线程持有锁
2.不可抢占:已经持有锁的线程不能被其他线程抢占
3.占有且等待:已经持有锁的线程可以请求其他锁,同时不释放已经持有的锁

保持热爱

#4 Created at ... [Delete] [Delete and Lock User]

更正#3
互斥、不可抢占、占有且等待、循环等待,这四个条件是死锁发生的必要条件
只要不满足其中一个就能避免死锁


  • 1

Reply