JavaSE之手动模拟死锁

来源:互联网 发布:sql图书馆数据库设计 编辑:程序博客网 时间:2024/06/06 12:31

【死锁模拟】


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


//提供公共的锁对象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的锁。这就是小编所模拟的死锁,希望对大家有所帮助。

原创粉丝点击