欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

线程同步下的死锁机制

程序员文章站 2022-03-10 16:03:02
...

死锁

比如说有两个线程T1和T2,在线程同步的情况下,有两个锁L1和L2。当T1线程持有L1锁,想去访问L2锁住的资源。当T2线程持有L2锁,想去访问L1下面的资源。这个时候T1和T2线程就会彼此僵持着,两个线程都不肯让步,等待彼此释放资源(开锁),就这样无限等待中。。。

手写死锁程序

创建两个锁对象
public class Lock {
    public static Object lock1=new Object();
    public static Object lock2=new Object();
}
创建一个类实现Runnable接口
package Deadlock;
/**
 * 死锁
 */
public class Deadlock implements Runnable {
    private boolean fig;

    public Deadlock(boolean fig) {   this.fig = fig;    }

    @Override
    public void run() {
        if(fig){
            while (true) {
                synchronized (Lock.lock2) {//lock2锁
                    System.out.println(Thread.currentThread().getName() + "   " + "lock2锁");
                    synchronized (Lock.lock1) {//lock1锁
                        System.out.println(Thread.currentThread().getName() + "   " + "lock1锁");
                    }
                }
            }
        }else {
            while (true) {
                synchronized (Lock.lock1) {//lock1锁
                    System.out.println(Thread.currentThread().getName() + "   " + "lock1锁");
                    synchronized (Lock.lock2) {//lock2锁
                        System.out.println(Thread.currentThread().getName() + "   " + "lock2锁");
                    }
                }
            }
        }
    }
}

这个类里面有个boolean类型的fig用于线程的切换,创建对象的时候传入一个boolean值,让一个线程执行分别执行if和else里面的代码,产生一个死锁。

创建一个测试类开启线程
package Deadlock;

public class Text {
    public static void main(String[] args) {
        Thread thread1=new Thread(new Deadlock(true));
        Thread thread2=new Thread(new Deadlock(false));

        thread1.start();
        thread2.start();
    }
}

运行结果:

线程同步下的死锁机制

运行多次后会发现,死锁是肯定会产生的,只是时间问题。第一种情况(左图):有可能是第一个线程抢到CPU的时间片,执行第一个锁(lock1),并上锁。输出一句话,没来得及判断第二个锁(lock2),CPU的执行权就被第二个线程抢到,第二个线程发现第二锁(lock2)没有上锁,输出一句话,并上锁。然后判断第一个锁(lock1),发现锁上了,等待。第一个线程又判断lock2,也发现锁上了,等待。程序就一直等待着!第二种情况是:第一个线程运气比较好,连续多次抢到了CPU的执行权,一但第二个线程抢到CPU执行权就会等待。

总结

在编程过程中,我们不是专门去写死锁,写BUG。而是为了知道死锁怎样产生的,然后避免死锁。



       每日鸡汤:越来越发现,越是阳光,正能量的人,才越会好运 。-----------------(比如说我,哈哈)


Over!