线程同步下的死锁机制

死锁

比如说有两个线程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!


猜你喜欢

转载自blog.csdn.net/chianz632/article/details/80029603