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 之死锁)的主要内容,如果未能解决你的问题,请参考以下文章