zoukankan      html  css  js  c++  java
  • 线程死锁问题

     1 package com.demo.bingfa;
     2 
     3 /**
     4  * java并发编程中,死锁的概念
     5  *
     6  * 我们启用了两个线程,分别抢占2个资源,但这两个资源又分别被不同的对象(字符串)锁住了。
     7  * 当第一个线程调用 resource1 方法,进入同步块,拿到锁,并等待 1 秒钟让另一个线程进入
     8  * resource2 同步块,当第二个线程进入同步块后,注意:此时, 拿着 resourec1 锁的线程企
     9  * 图拿到 resource2 的锁,但这个时候,拿着 resource2 的线程也想去拿 resource1 的锁。于
    10  * 是就出现了互相僵持的情况,谁也无法拿到对方的锁,整个系统就卡死了。
    11  */
    12 public class DeadLock {
    13     public static void main(String[] args) {
    14         //lambda表达式,
    15         //启动一个线程去获取资源1。
    16         Thread thread1 = new Thread(() -> {
    17             try {
    18                 new DeadLock().resource1();
    19             } catch (InterruptedException e) {
    20                 e.printStackTrace();
    21             }
    22         });
    23         thread1.setName("线程1");
    24         thread1.start();
    25 
    26         //启动另一个线程去获取资源2.
    27         Thread thread2 = new Thread(() -> {
    28             try {
    29                 new DeadLock().resource2();
    30             } catch (InterruptedException e) {
    31                 e.printStackTrace();
    32             }
    33         });
    34         thread2.setName("线程2");
    35         thread2.start();
    36     }
    37 
    38     void resource1() throws InterruptedException{
    39         synchronized ("resource1"){
    40             System.out.println("获取资源1");
    41             //等待1秒,让另外一个线程获取资源
    42             Thread.sleep(1 * 1000);
    43             resource2();
    44         }
    45     }
    46 
    47      void resource2() throws InterruptedException{
    48          synchronized ("resource2"){
    49              System.out.println("获取资源2");
    50              //等待1秒,让另外一个线程获取资源
    51              Thread.sleep(1 * 1000);
    52              resource1();
    53          }
    54     }
    55 }

    我们以后在线上的话,怎么去查找线程死锁的问题呢?

    1:jps命令。线程号,类名

    2:jstack  打印进程栈的信息

  • 相关阅读:
    Lab IGMP
    IGMP知识要点
    15、通过例子讲解逻辑地址转换为物理地址的基本过程
    14、一个程序从开始运行到结束的完整过程,你能说出来多少?
    13、进程状态的切换你知道多少?
    12、虚拟技术你了解吗?
    11、动态分区分配算法有哪几种?可以分别说说吗?
    线程池
    10、内存交换和覆盖有什么区别?
    9、如果系统中具有快表后,那么地址的转换过程变成什么样了?
  • 原文地址:https://www.cnblogs.com/bulrush/p/10766929.html
Copyright © 2011-2022 走看看