JavaSE之手动模拟死锁

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Phone_1070333541/article/details/78671414

【死锁模拟】


什么是死锁?
通俗来讲死锁就像两个人,一个人买东西,一个人卖东西,买东西的人说:你给我东西我给你钱,卖东西的人说:你给我钱我给你东西。这俩人杠上了,这个时候没有一个人来调解,这俩人谁都不会善罢甘休。
官方的话来说,两个线程发生了资源竞争,都在等对方释放资源,这时候如果没有外力因素就会一直等下去,接下来有一个例子来模拟死锁。


//提供公共的锁对象
class MyLock{
    static MyLock lock1=new MyLock(); 
    static MyLock lock2=new MyLock();
}
//死锁类实现
class DeadClock implements Runnable{
    private boolean flag;
    public DeadLock(){
    }
    public DeadLock(boolean flag){
        this.flag=flag;
    }
    public void run(){
        if(flag==true){
            synchronized(MyLock.lock1){
                syso("拿到了锁1");
                synchronized(MyLock.lock2){
                    syso("拿到了锁1和锁2");
                }
            }
        }else{
            synchronized(MyLock.lock2){
                syso("拿到了锁2");
                synchronized(MyLock.lock1){
                    syso("拿到了锁2和锁1");
                }
            }
        }
    } //run
} //DeadLock
//测试类
public class MyTest{
    main(){
        DeadLock d1=new DeadLock(true);
        DeadLock d2=new DeadLock(flase);
        Thread t1=new Thread(d1);
        Thread t2=new Thread(d2);
        t1.start();
        t2.start();
    }
}

当然这是一个概率事件,多运行几次你就会发现,一个线程拿到锁1,另一个线程拿到锁2,这个时候程序没有结束,就发生了所谓的死锁现象,线程1等着线程2的锁,线程2等着线程1的锁。这就是小编所模拟的死锁,希望对大家有所帮助。

猜你喜欢

转载自blog.csdn.net/Phone_1070333541/article/details/78671414
今日推荐