并发处理:锁,写一个死锁的实例和线程监控

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wd2014610/article/details/82020061

锁是一个非常有用的工具,运用的场景非常多,因为他使用起来非常的简单,而且易于理解。但是,锁的问题就是很可能会出现一个非常坏的事情,就是一旦造成死锁,就会导致线程得不到释放,一旦死锁的线程出现的太多,就会造成系统的不可用。

一、死锁的例子

学习掌握一个概念,最好的方法就是去写一个例子。
复制出去,即可立马验证了。

package com.newframe.controllers.api;

/**
 * @author:wangdong
 * @description:测试死锁
 */
public class TestDeadlock {

    private static String A = "A";

    private static String B = "B";

    public static void main(String[] args) {
        new TestDeadlock().deadLock();
    }

    private void deadLock(){

        //创建一个线程t1
        Thread t1 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (A){
                    try{
                        //因为程序是以多线程的方式执行的,所以这里有意睡眠,不释放资源,是为了造成死锁
                        Thread.sleep(2000);
                    }catch (InterruptedException e){
                        e.printStackTrace();
                    }
                    synchronized (B){
                        System.out.println("1");
                    }
                }
            }
        });

        //创建一个线程t2
        Thread t2 = new Thread(new Runnable() {
            @Override
            public void run() {
                synchronized (B){
                    synchronized (A){
                        System.out.println("2");
                    }
                }
            }
        });
        //因为两个线程是同时启动的,但是线程1有睡眠的不释放资源的操作。
        //所以如果是线程1先执行,就会造成死锁
        //线程2中没有睡眠,如果线程2先执行,就会线程2执行完及时释放资源,线程1接着执行完毕,不会出现死锁
        t1.start();
        t2.start();;
    }

}

二、如何查看出现了死锁

其实很简单,你的程序卡住了。
但是并不直观,直观的是借助工具,来监控程序

1、下面是我步骤一中的死锁监控

这里写图片描述

很明显可以看出,爆红了,我的仅有的两个线程都出现了死锁。
并且可以看到出现死锁的线程情况。
互相不释放资源。
这里写图片描述

2、下面是我没有死锁的程序的健康程序

这里写图片描述

很明显没有出现死锁,程序是OK的。
这里写图片描述

好啦,学习是一个过程,不断的去进步!

猜你喜欢

转载自blog.csdn.net/wd2014610/article/details/82020061