java并发编程:死锁代码示例 灰太狼 2022-01-27 12:13 216阅读 0赞 ### java并发编程:死锁代码示例 ### ##### 死锁概念: ##### > 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。 > \-------- 百度百科 ##### 死锁的规范定义: ##### > 集合中的每一个进程都在等待只能由本集合中的其他进程才能引发的事件,那么该组进程是死锁的。 > \-------- 百度百科 ##### 代码示例: ##### /** * java死锁示例 */ public class DeadLock { private static final Object OBJECT1 = new Object(); private static final Object OBJECT2 = new Object(); public static void main(String[] args) { new Thread(() -> { synchronized (OBJECT1) { try { // cpu执行太快,利用休眠触发死锁 Thread.sleep(1000); } catch (InterruptedException e) { e.printStackTrace(); } synchronized (OBJECT2) { System.out.println("OBJECT1获取到了OBJECT2的锁!"); } } }).start(); new Thread(() -> { synchronized (OBJECT2) { synchronized (OBJECT1) { System.out.println("OBJECT2获取到了OBJECT1的锁!"); } } }).start(); } } ##### 查看死锁的方法: ##### ###### 方法一:jps + jstack ###### 首先用`jps`查看进程id Terminal:$ jps 1488 Launcher 1489 DeadLock 1490 Jps 1255 再用`jstack 1489`(进程id) 查看堆栈信息 Terminal:$ jstack 1489 Found one Java-level deadlock: ============================= "Thread-1": waiting to lock monitor 0x00007fdf0e80ed68 (object 0x000000076ac28c70, a java.lang.Object), which is held by "Thread-0" "Thread-0": waiting to lock monitor 0x00007fdf0e8100a8 (object 0x000000076ac28c80, a java.lang.Object), which is held by "Thread-1" Java stack information for the threads listed above: =================================================== "Thread-1": at com.farstars.demo.DeadLock.lambda$main$1(DeadLock.java:29) - waiting to lock <0x000000076ac28c70> (a java.lang.Object) - locked <0x000000076ac28c80> (a java.lang.Object) at com.farstars.demo.DeadLock$$Lambda$2/2129789493.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) "Thread-0": at com.farstars.demo.DeadLock.lambda$main$0(DeadLock.java:21) - waiting to lock <0x000000076ac28c80> (a java.lang.Object) - locked <0x000000076ac28c70> (a java.lang.Object) at com.farstars.demo.DeadLock$$Lambda$1/1607521710.run(Unknown Source) at java.lang.Thread.run(Thread.java:748) Found 1 deadlock. 从上述堆栈信息中可以很明显的看到发生了死锁现象。 ##### 方法二:jconsole ##### 命令行直接敲`jconsole`命令,使用自带的控制台查看死锁情况 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjA1MzU2_size_16_color_FFFFFF_t_70] 这里选择`本地进程`中的死锁类即可,然后点击`连接`。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjA1MzU2_size_16_color_FFFFFF_t_70 1] 然后再点击`线程`这一栏,点击下方`检测死锁`。 ![在这里插入图片描述][watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjA1MzU2_size_16_color_FFFFFF_t_70 2] 这里也可以清晰的看到进程的死锁情况,`Thread-0`和`Thread-1`分别持有对方的锁。 ##### 总结: ##### 非常简单的死锁代码示例,同时利用java自带的工具帮助我们确认是否发生死锁现象。 [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjA1MzU2_size_16_color_FFFFFF_t_70]: /images/20220127/2475cbe3ef2c44e1a0dade545686df3d.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjA1MzU2_size_16_color_FFFFFF_t_70 1]: /images/20220127/b6bcedef16c543d28d327ee51abfe7dc.png [watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM0MjA1MzU2_size_16_color_FFFFFF_t_70 2]: /images/20220127/420d56d892a24f0cab508dd6d78cd878.png
相关 Java并发编程:死锁示例 死锁是多线程并发编程中的一种严重问题,当一个或多个线程因等待其他线程释放已获得的资源而造成的一种相互“僵持”的状态时,就可能发生死锁。 下面是一个经典的死锁示例(使用Java 痛定思痛。/ 2024年09月18日 03:36/ 0 赞/ 11 阅读
相关 Java并发编程中死锁问题示例 死锁是Java并发编程中的一个常见问题。当两个或更多的线程相互等待对方释放资源时,就会发生死锁。 以下是一个简单的Java死锁示例: ```java // 线程1需要资源A 末蓝、/ 2024年09月16日 22:12/ 0 赞/ 6 阅读
相关 Java并发编程:死锁问题示例 死锁是Java并发编程中常见的问题,当两个或更多的进程在执行过程中因竞争资源而造成的一种状态,若无外力干涉它们将无法继续执行。 下面是一个简单的Java代码示例来说明死锁的形 素颜马尾好姑娘i/ 2024年09月16日 18:58/ 0 赞/ 16 阅读
相关 Java并发编程中死锁问题示例 在Java并发编程中,死锁是一个常见的问题。以下是一个简单的死锁示例: ```java // 定义两个线程 class ThreadOne implements Runnab 骑猪看日落/ 2024年09月14日 15:27/ 0 赞/ 17 阅读
相关 Java并发编程中死锁现象示例 在Java并发编程中,死锁是一种严重的问题,当两个或更多的进程因争夺资源而造成的一种相互等待的现象时,就可能产生死锁。 下面是一个简单的死锁示例: ```java // 定 ゝ一纸荒年。/ 2024年09月13日 08:00/ 0 赞/ 14 阅读
相关 并发编程:Java中的死锁示例 在Java编程中,死锁是一个常见的并发问题。当两个或更多的线程互相等待对方释放资源时,就会发生死锁。 以下是一个Java中创建死锁的简单示例: ```java import 左手的ㄟ右手/ 2024年09月10日 04:03/ 0 赞/ 28 阅读
相关 Java并发编程问题:死锁示例 死锁是多线程编程中的一种常见问题。当两个或更多的线程在执行过程中,因争夺资源而造成的一种相互等待的现象称为死锁。 以下是一个简单的Java死锁示例: ```java // 拼搏现实的明天。/ 2024年09月06日 06:15/ 0 赞/ 18 阅读
相关 java并发编程—死锁 死锁 死锁是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法继续执行下去。 死锁的解决方法有以下几种: 1. 避免死锁 淩亂°似流年/ 2023年10月12日 12:34/ 0 赞/ 22 阅读
相关 java并发编程:死锁代码示例 java并发编程:死锁代码示例 死锁概念: > 死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将 灰太狼/ 2022年01月27日 12:13/ 0 赞/ 217 阅读
还没有评论,来说两句吧...