死锁的产生以及案例

 什么情况下导致线程死锁:

所谓死锁是指多个线程因竞争资源而造成的一种僵局(互相等待),若无外力作用,这些进程都将无法向前推进。

 产生条件:
(1)互斥条件:

线程要求对所分配的资源(如打印机)进行排他性控制,即在一段时间内某 资源仅为一个线程所占有。此时若有其他线程请求该资源,则请求线程只能等待。
(2)不剥夺条件:线程所获得的资源在未使用完毕之前,不能被其他线程强行夺走,即只能由获得该资源的线程自己来释放(只能是主动释放)。
(3)请求和保持条件:线程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他线程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放。
(4)循环等待条件:存在一种线程资源的循环等待链,链中每一个线程已获得的资源同时被链中下一个线程所请求。即存在一个处于等待状态的线程集合{Pl, P2, ..., pn},其中Pi等待的资源被P(i+1)占有(i=0, 1, ..., n-1),Pn等待的资源被P0占有

public class DeadLock implements Runnable{
   public int ff=1;
    //静态对象是类的所有对象共享的
    //new两个object
    private static Object o1 = new Object(),
            o2 = new Object();
    @Override
    public void run() {
        System.out.println("ff=" + ff);
        //如果为1就o1对象先锁然后再锁o2
        if (ff==1){
            synchronized (o1){
                try {
                    Thread.sleep(500);
                    System.out.println("锁o1");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o2){
                    System.out.println("o2");
                }
            }
        }
        //如果为0就o2对象先锁然后再锁o2
        if (ff==0){
            synchronized (o2){
                try {
                    Thread.sleep(500);
                    System.out.println("锁o2");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("o1");
                }
            }
        }
    }
}

 //执行代码
        DeadLock deadLock1 = new DeadLock();
        DeadLock deadLock2 = new DeadLock();

        deadLock1.ff=1;
        deadLock2.ff=0;
        //deadLock1,deadLock2 都处于可执行状态,但 JVM 线程调度先执行哪个线程是不确定的。
        //deadLock2 的 run()可能在 deadLock1 的 run()之前运行
        new Thread(deadLock1).start();
        new Thread(deadLock2).start();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值