19、多线程的死锁

版权声明:版权归 爱装逼的文艺小青年所有 https://blog.csdn.net/toyota_rav4/article/details/85208433

在多线程系列文章第一篇中我们讲解到了死锁的概念。

由上图可知,死锁就是多个线程都在等待对方释放自己所需要的锁。 我们知道机器不像我们人这么的谦让,他们都是抢占资源跑任务的。所以“你若不释放,我打死也不会释放。”

下面的例子演示了死锁。

package com.demo3;

public class MyObject implements Runnable {

    private Object lock = new Object();
    private Object lock2 = new Object();
    private Object lock3 = new Object();

    @Override
    public void run() {
        if (Thread.currentThread().getName().equals("A")) {
            synchronized (lock) {
                try {
                    System.out.println("线程A拿到lock");
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock2) {
                    System.out.println("线程A拿到lock2");
                }
            }
        }
        if (Thread.currentThread().getName().equals("B")) {
            synchronized (lock2) {
                try {
                    System.out.println("线程B拿到lock2");
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock3) {
                    System.out.println("线程B拿到lock3");
                }
            }
        }
        if (Thread.currentThread().getName().equals("C")) {
            synchronized (lock3) {
                try {
                    System.out.println("线程C拿到lock3");
                    Thread.sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (lock) {
                    System.out.println("线程C拿到lock");
                }
            }
        }
    }
}
package com.demo3;

public class Run {
    public static void main(String[] args) {
        MyObject myObject = new MyObject();
        Thread threadA = new Thread(myObject,"A");
        Thread threadB = new Thread(myObject,"B");
        Thread threadC = new Thread(myObject,"C");
        threadA.start();
        threadB.start();
        threadC.start();
    }
}

运行结果:

线程A拿到lock
线程B拿到lock2
线程C拿到lock3

abc,线程拿到 lock lock2 lock3之后,就再也没有释放锁,来达到交、交换锁,执行后续代码的情况。这也就是死锁。为了进一步验证我们的判断,我们使用terminal命令行来查看:

F:\daydayup\thread-demo>jps
11952 Launcher
1348 Run
8740
7084 Jps
F:\daydayup\thread-demo>jstack -l 1348
2018-12-22 15:19:55
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.31-b07 mixed mode):
......
Java stack information for the threads listed above:
===================================================
"C":
        at com.demo3.MyObject.run(MyObject.java:46)
        - waiting to lock <0x00000000d732d6c0> (a java.lang.Object)
        - locked <0x00000000d732d6e0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)
"A":
        at com.demo3.MyObject.run(MyObject.java:20)
        - waiting to lock <0x00000000d732d6d0> (a java.lang.Object)
        - locked <0x00000000d732d6c0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)
"B":
        at com.demo3.MyObject.run(MyObject.java:33)
        - waiting to lock <0x00000000d732d6e0> (a java.lang.Object)
        - locked <0x00000000d732d6d0> (a java.lang.Object)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

有输出结果足以验证死锁的产生。我们在日常工作中,应该避免死锁。

猜你喜欢

转载自blog.csdn.net/toyota_rav4/article/details/85208433
今日推荐