美文网首页编程学习
多线程练习--死锁

多线程练习--死锁

作者: 比轩 | 来源:发表于2016-11-15 21:05 被阅读96次

关于java的死锁可能网上一大堆的代码,作为初学者我觉得还是很有必要练习下,亲自实现,并分析其死锁的原理。

死锁的原因:

因为两个或者多个进程互相需要对方手里的锁而进入了一种互相等待的状态。代码都是顺序执行的,所以不能倒退,也就没有办法交出手里的锁,这是一个大的前提。

如何形成死锁:

举个两个进程死锁的例子。首先,死锁很重要的另一个前提就是锁的唯一性,我们都知道同步代码块需要传递一个对象,也就是我们说的锁。两个进程的死锁需要两把锁,此时就须要保证这两把锁都是唯一性,也就需要两把锁都是静态的对象,就像这样:

class LockTemp {
    static final LockTemp l = new LockTemp ();
}

然后构造两个嵌套的同步代码块,如下代码所示:

synchronized (LockA.lock) {
        System.out.println("进入外层同步代码块");
                synchronized (LockB.lock) {
                        System.out.println("进入内层同步代码块");
        }
}

两个代码块构造完成后,需要让一个t1进程进入A嵌套代码块的外层,另一个t2进程进入B嵌套代码块的外层,此时t1需要的另一锁在t2手上,t2需要的另一把锁在t1手上,所以进入了一种互相等待的状态,而这种等待的状态是没有办法结束的,所以程序进入了死锁状态。

完整的code:

package thread;

/*
 * java多线程死锁的练习 
 */
public class LockDemo {
    public static void main(String[] args) {
        // 来两个dead对象,一个为true,一个为false
        Dead d1 = new Dead(true);
        Dead d2 = new Dead(false);

        // 创建两个进程对象并start
        Thread t1 = new Thread(d1);
        Thread t2 = new Thread(d2);
        t1.start();
        t2.start();
    }
}

// 先来两把锁
class LockA {
    static final LockA l = new LockA();
}

class LockB {
    static final LockB l = new LockB();
}

// 实现死锁的类
class Dead implements Runnable {
    // 定义一个私有的boolean变量,来决定线程进入同步代码的方向
    private boolean flag;

    public Dead(boolean flag) {
        this.flag = flag;
    }

    public void run() {

        while (true) {
            if (flag == true) {

                synchronized (LockA.l) {
                    System.out.println("if...A");
                    synchronized (LockB.l) {
                        System.out.println("if...B");
                    }
                }
            } else {
                synchronized (LockB.l) {
                    System.out.println("else...B");
                    synchronized (LockA.l) {
                        System.out.println("else...A");
                    }
                }
            }
        }
    }
}

相关文章

  • 多线程练习--死锁

    关于java的死锁可能网上一大堆的代码,作为初学者我觉得还是很有必要练习下,亲自实现,并分析其死锁的原理。 死锁的...

  • Java自学-多线程 死锁

    Java 演示多线程死锁 当业务比较复杂,多线程应用里有可能会发生死锁 步骤 1 : 演示死锁 线程1 首先占有对...

  • Java并发案例01---多线程之死锁

    多线程之死锁案例一

  • jstack命令:教你如何排查多线程问题

    这是之前的一个死锁案例: 一个多线程死锁案例,如何避免及解决死锁问题? 如程序中发生这样的死锁问题该如何排查呢?我...

  • 并发编程情况下几个相应问题简介

    1.并发编程的挑战之死锁 ​ 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 多线程分析——死锁代码demo

    前言 本文主要是对Java多线程死锁代码demo的分析,对其过程以及死锁进行了大致的概括,希望对大家有帮助。 死锁...

  • 面试官:连多线程问题你都一问三不知,还要我怎么“放水”?

    面试官:问你几个多线程相关的问题吧,说一下导致线程死锁的原因,怎么解除线程死锁? 程序员阿里:这个...死锁......

  • 线程同步中的死锁

    何为死锁 多线程各自持有不同的锁,并互相试图获取对方已持有的锁,导致无限等待的状况,称为死锁。比如: 避免死锁 避...

  • iOS多线程总结

    多线程 优缺点,实际应用多线程比较死锁:使用同步sync,向同一个/当前的串行队添加任务,会产生死锁新等旧,旧等新...

网友评论

    本文标题:多线程练习--死锁

    本文链接:https://www.haomeiwen.com/subject/ajelpttx.html