Java高并发编程JUC(review2 之死锁)

本文将深入探讨Java并发库JUC的高级特性,包括线程定制、锁机制、线程安全集合及死锁的编码与检测。通过实例讲解如何避免和解决死锁问题,并分享面试中可能遇到的相关知识点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

过了个元宵又鸽了几天,回学校又耽误了两天,那么现在也是回到学校了,更新第一篇东西,其实就是先前没说完的内容:java多线程(review) 我们在系统性地说说这个东西,比较重要,而且面试重点,首先是说说JUC 这个其实就是 java.util.concurrent这个包下面的玩意儿,像什么线程池之类的玩意儿。值得一提的是,这个线程这玩意我现在自己梳理起来发现真的内容不少,有不少地方可以好好聊聊,而且玩到这个部分,我觉得可以对nutty下手了,看看它的实现过程。

当然一些老掉牙的基本概念我就不复述了。那么为什么要说这个JUC咧,很简单,你以为前面的那些东西就够用了吗,那些玩意充其量只是小白入门看看的(虽然我也是大菜鸟)

首先是我们这个线程的定制化,我们先前是用sycnchornized这个同步块实现了一个管程法,然后随便演示了一个lock,其实那个关于lock的话也是可以实现这个功能的,人家也有await,但是我没写~ 还有就是线程安全不安全的集合,还有可定制化的JUC高并发框架,我都没说,当然还有啥CAS,还有读写锁等等。这里面的内容也是比较多的,当然还有数据库的部分也是没有补充完,所以这几篇博客都是有一点我就写一点,做一个系列吧。合在一起看着也累。

死锁

什么叫死锁类,其实就是由于共享的资源问题导致的线程堵塞。

image.png

编码

这个编码就简单了



import java.util.concurrent.TimeUnit;

public class DeathLock {

    public static void main(String[] args) {

        Object A = new Object();
        Object B = new Object();

        new Thread(()->{
            synchronized (A){
                System.out.println("获取到A,即将获取到B");
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                synchronized (B){
                    System.out.println("获取到B");
                }
            }

        }).start();

        new Thread(()->{
            synchronized (B){
                System.out.println("获取到B,即将获取到A");
                synchronized (A){
                    System.out.println("获取到A");
                }
            }

        }).start();


    }
}

判断死锁

这个主要是做一个小检测,有时候,发生堵塞不一定是死锁,所以有时候我们可以使用工具去验证,这个的话就在java 的bin目录下面带了一个工具 jstask。用这个就可以检测

首先的话我们是需要获取到我们java程序对应的pid jsp -l 可以查看

现在我们运行程序触发死锁

image.png

找到我们想要检测的程序的pid

image.png

之后使用jstask 检测:
jstack 8684

image.png

这里就检测出来了,而且查看报错,我们到第31和21行附件查看代码,发现的确是我们故意设置死锁的地方。

image.png

OK 就先这样吧,刚刚回到学校,一点状态都没有。这个多线程系列,我还是打算慢慢更新吧,我想还是自己搞细致一点,也说的细致一点。

附赠

附赠一个面试题,启动两个线程依次输出1A2B3C…9I

image.png

这里我就直接使用信号实现

public class Fuck {
    public static void main(String[] args) {

        char[] nums = "123456789".toCharArray();
        char[] chars = "ABCDEFGHI".toCharArray();
        AtomicInteger flag = new AtomicInteger();

        ReentrantLock Lock = new ReentrantLock();
        Condition numcodition = Lock.newCondition();
        Condition wordcodition = Lock.newCondition();

        new Thread(()->{
            for(char n:nums){
                try {
                    Lock.lock();
                    if(flag.get() ==0)
                    {
                        System.out.print(n);
                        flag.set(1);
                        wordcodition.signal();
                    }

                    else
                        numcodition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    Lock.unlock();
                }

            }

        }).start();
        new Thread(()->{
            for(char c:chars){
                try {
                    Lock.lock();
                    if(flag.get() ==1)
                    {
                        System.out.print(c);
                        flag.set(0);
                        numcodition.signal();
                    }

                    else
                        wordcodition.await();
                } catch (InterruptedException e) {
                    e.printStackTrace();
                } finally {
                    Lock.unlock();
                }

            }

        }).start();


    }
}

来再把这个改成死锁

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Huterox

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值