天天看点

同步的缺陷-死锁问题 | 带你学《Java语言高级特性》之十

上一篇:使用同步解决多人卖票问题 | 带你学《Java语言高级特性》之九

【本节目标】

通过阅读本节内容,你将通过实际运行一段代码发现两个进程互相等待对方让出资源而造成死锁的问题,了解到此问题出现的原因并具有一定的避免此类问题的认识。

死锁

死锁是在进行多线程同步的处理之中有可能产生的一种问题,所谓的死锁指的是若干个线程彼此互相等待的状态。

下面通过一个简单的代码来观察一下死锁的表现形式,但是对于此代码不作为重点。

范例:死锁的展示

class Jian {
    public synchronized void say(XiaoQiang xq) {
        System.out.println("阿健说,此路是我开,要想从此过,留下10块钱。") ;
        xq.get() ;
    }
    public synchronized void get() {
        System.out.println("阿健说,得到了10块钱,可以买饭吃了,于是让出了路");
    }
}
class XiaoQiang {
    public synchronized void say(Jian jj) {
        System.out.println("小强说,让我先过去,然后给你钱") ;
        jj.get();
    }
    public synchronized void get() {
        System.out.println("小强说,逃过了一劫,可以继续送快餐了。");
    }
}
public class DeadLock implements Runnable {
    private Jian jj = new Jian() ;
    private XiaoQiang xq = new XiaoQiang() ;
     @Override
    public void run() {
        jj.say(xq) ;
    }
    public DeadLock() {
        new Thread(this).start() ;
        xq.say(jj) ;
    }
    public static void main(String[] args) {
        new DeadLock() ;
    }
}           
同步的缺陷-死锁问题 | 带你学《Java语言高级特性》之十

图一 执行结果图

现在死锁造成的主要原因是因为彼此都在互相等待着,等待着对方先让出资源。死锁实际上是一种开发中出现的不确定的状态,有的时候代码处理不当,则会不定期出现死锁,这属于正常开发中的调试问题。

若干个线程访问同一资源时一定要进行同步处理,而过多的同步则会造成死锁。

想学习更多的Java的课程吗?从小白到大神,从入门到精通,更多精彩不容错过!免费为您提供更多的学习资源。

本内容视频来源于

阿里云大学 下一篇:经典案例:生产者-消费者模型 | 带你学《Java语言高级特性》之十一 更多Java面向对象编程文章查看此处