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

Posted 'or 1 or 不正经の泡泡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java高并发编程JUC(review2 之死锁)相关的知识,希望对你有一定的参考价值。

文章目录

前言

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

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

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

死锁

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

编码

这个编码就简单了



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 可以查看

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

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

之后使用jstask 检测:
jstack 8684

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

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

附赠

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

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

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();


    

来再把这个改成死锁

以上是关于Java高并发编程JUC(review2 之死锁)的主要内容,如果未能解决你的问题,请参考以下文章

尚硅谷JUC高并发编程学习笔记

尚硅谷JUC高并发编程学习笔记

尚硅谷JUC高并发编程学习笔记

Java并发编程系列之三JUC概述

JUC并发编程 活跃性 -- 死锁 & 定位死锁 & 哲学家就餐问题

Java并发JUC—ReentrantReadWriteLock有坑,小心读锁!