55行代码实现Java线程死锁

时间:2023-02-20 21:18:00

死锁是Java多线程的重要概念之一,也经常出现在各大公司的笔试面试之中。那么如何创造出一个简单的死锁情况?请看代码:

class Test implements Runnable    
{
boolean flag;  
Test(boolean flag)
{
this.flag = flag;
}
public void run()    
{
if(flag)
{
while(true)    //这里用while(true)使得线程在这里无限循环,可以避免各种随机情况造成死锁不成功
synchronized(MyLock.a)    //这里设置同步锁为MyLock.a
{
System.out.println("Afirstlayer");
synchronized(MyLock.b)    //这里设置同步锁为MyLock.b
{
System.out.println("Asecondlayer");
}
}
}
else
{
while(true)
synchronized(MyLock.b)    //这里设置同步锁为MyLock.b
{
System.out.println("Bfirstlayer");
synchronized(MyLock.a)    //这里设置同步锁为MyLock.a
{
System.out.println("Bsecondlayer");
}
} }
}
} class MyLock    //创建两个同步锁对象
{
public static final Object a = new Object();
public static final Object b = new Object();
} class DeadLock
{
public static void main(String[] args)
{
Test x = new Test(true);    
Test y = new Test(false);    //这里分别新建两个flag分别为true和false的Test实例,这样它们所对应的线程会进入run()中不同的分支
Thread t1 = new Thread(x);
Thread t2 = new Thread(y);
t1.start();
t2.start();
}
}

很显然,当t1和t2启动后执行run(),进入第一层后它们分别会占用MyLock.a和MyLock.b这两个同步锁。

然而如果想进入第二层同步块它们又分别需要MyLock.b和MyLock.a,这就导致了它们都无法进行下去,造成死锁情况。

运行结果如下:

55行代码实现Java线程死锁

运行之后程序卡住,只能按Ctrl+C才能回到命令行输入状态。

55行代码实现Java线程死锁的更多相关文章

  1. Java线程死锁查看分析方法

    如何查看是否有Java线程死锁?下面介绍两种方法. 一.Jconsole        Jconsole是JDK自带的图形化界面工具,使用JDK给我们的的工具JConsole,可以通过打开cmd然后输 ...

  2. java 线程死锁的检测

    java 线程死锁的检测   例子程序: import java.util.concurrent.CountDownLatch; import java.util.concurrent.Executo ...

  3. JDK中ThreadDump诊断Java代码中的线程死锁问题

    多线程的死锁..死锁不是死了而是线程互相等待... 在项目中可能就是在几十万行的代码中存在一个死锁的问题,如何发现这个问题并且解决这个问题. JavaJDK为我们提供了一个诊断工具叫做ThreadDu ...

  4. Java——线程死锁问题

    body, table{font-family: 微软雅黑; font-size: 10pt} table{border-collapse: collapse; border: solid gray; ...

  5. 诊断Java线程死锁

    比如我们有运行这样一个程序: 了解多线程的小伙版都知道,这段代码不会有打印结果,因为发生了死锁.我们在服务器上运行试试,没有输出,对应的进程是 32752. 使用 “jstack 32752”排查,后 ...

  6. 一个Java线程死锁的例子

    package com.lk.B; public class Test4 { private static final Object o1 = new Object(); private static ...

  7. JAVA线程死锁

    文件名:DeadThreadByExtend.java 注: 1.起线程的时候用的是start方法,run方法也可以调用,但是仅仅相当于普通调用,在当前线程内执行. 2.synchronized 不能 ...

  8. 【!Important】Java线程死锁查看分析方法

    一.Jconsole Jconsole是JDK自带的图形化界面工具,使用JDK给我们提过的工具JConsole,可以通过cmd打开命令框然后输入Jconsole打开图形工具 然后点击检测死锁就可以查看 ...

  9. 学习资料分享(Java第一行代码视频)<susmote.com>

    17年买了一本书,第一行代码(JAVA),李兴华编写的. 一开始我是按照书本一页一页的啃,一个点一个点的去学,虽然当时学的有些枯燥,但里面的知识点大部分还是弄的懂,只是一次偶然,因为有点质疑书上写的( ...

随机推荐

  1. STM32 使用 FreeRTOS过程记录

    资源:http://blog.csdn.net/zhzht19861011/article/category/6191478 资源:可以下载安富莱的STM32-V5开发版资料中的FreeRTOS教程, ...

  2. Android 图片的缩放与旋转

    本文实现Android中的图片的缩放效果 首先设计布局: <LinearLayout xmlns:android="http://schemas.android.com/apk/res ...

  3. Caused by&colon; java&period;lang&period;ClassNotFoundException&colon; com&period;mchange&period;v2&period;ser&period;Indirector

    1.错误描述 usage: java org.apache.catalina.startup.Catalina [ -config {pathname} ] [ -nonaming ] { -help ...

  4. ASP&period;NET Core 实战:使用 NLog 将日志信息记录到 MongoDB

    一.前言 在项目开发中,日志系统是系统的一个重要组成模块,通过在程序中记录运行日志.错误日志,可以让我们对于系统的运行情况做到很好的掌控.同时,收集日志不仅仅可以用于诊断排查错误,由于日志同样也是大量 ...

  5. Node&period;js&lowbar;express&lowbar;服务器渲染页面 ejs

    服务器渲染页面 ejs 高效的 js 模版引擎 将数据提前渲染到页面上, 再将渲染好的页面返回响应给浏览器 提高首页加载速度 SEO 提前处理,提高加载速度 下载 ejs 包 npm install ...

  6. day 0314函数的进阶

    1.空间:内置空间,全局空间,局部空间. 内置空间:空间存放python解释器,为我们提供了方便的名字:input,print,str,list,tuple 三个空间的加载顺序: 内置空间>&g ...

  7. Heap堆分析(堆转储、堆分析)

    一.堆直方图 减少内存使用时一个重要目标,在堆分析上最简单的方法是利用堆直方图.通过堆直方图我们可以快速看到应用内的对象数目,同时不需要进行完整的堆转储(因为堆转储需要一段时间来分析,而且会消耗大量磁 ...

  8. 要想找出包含&OpenCurlyDoubleQuote;w”的名字

    要想找出包含“w”的名字:mysql> SELECT * FROM pet WHERE name LIKE '%w%'“_”:匹配任何单个字符“%”:匹配任意数目字符(包括零字符)

  9. Navicat 连接 Mysql8&period;0 出现2059问题的解决方法

    ``` 登陆Mysql后执行命令 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password'; ...

  10. USACO 6&period;4 The Primes

    The PrimesIOI'94 In the square below, each row, each column and the two diagonals can be read as a f ...