首页 > 其他分享 >死锁(Dead Lock)

死锁(Dead Lock)

时间:2024-03-29 19:00:34浏览次数:12  
标签:lockB lockA java String Thread Lock Dead 死锁

概念

死锁是指两个或多个以上的进程在执行过程中,因争夺资源而造成一种互相等待的现象,若无外力干涉那他们都将无法推进下去,如果资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁
pFI3PIO.md.png

产生死锁的原因
  • 系统资源不足

  • 进程运行推进的顺序不对

  • 资源分配不当

死锁产生的四个必要条件
  • 互斥

解决方法:把互斥的共享资源封装成可同时访问

  • 占有且等待

解决方法:进程请求资源时,要求它不占有任何其它资源,也就是它必须一次性申请到所有的资源,这种方式会导致资源效率低。

  • 非抢占式

解决方法:如果进程不能立即分配资源,要求它不占有任何其他资源,也就是只能够同时获得所有需要资源时,才执行分配操作

  • 循环等待

解决方法:对资源进行排序,要求进程按顺序请求资源。

死锁代码
我们创建了一个资源类,然后让两个线程分别持有自己的锁,同时在尝试获取别人的,就会出现死锁现象

/**
 * 死锁小Demo
 * 死锁是指两个或多个以上的进程在执行过程中,
 * 因争夺资源而造成一种互相等待的现象,
 * 若无外力干涉那他们都将无法推进下去
 */

import java.util.concurrent.TimeUnit;

/**
 * 资源类
 */
class HoldLockThread implements Runnable{

    private String lockA;
    private String lockB;

    // 持有自己的锁,还想得到别人的锁

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }


    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println(Thread.currentThread().getName() + "\t 自己持有" + lockA + "\t 尝试获取:" + lockB);

            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (lockB) {
                System.out.println(Thread.currentThread().getName() + "\t 自己持有" + lockB + "\t 尝试获取:" + lockA);
            }
        }
    }
}
public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";

        new Thread(new HoldLockThread(lockA, lockB), "t1").start();

        new Thread(new HoldLockThread(lockB, lockA), "t2").start();
    }
}

运行结果,main线程无法结束

t1	 自己持有lockA	 尝试获取:lockB
t2	 自己持有lockB	 尝试获取:lockA
如何排查死锁

当我们出现死锁的时候,首先需要使用jps命令查看运行的程序

jps -l

我们能看到DeadLockDemo这个类,一直在运行
pFI3kJe.md.png

在使用jstack查看堆栈信息

jstack  7560   # 后面参数是 jps输出的该类的pid

得到的结果

Found one Java-level deadlock:
=============================
"t2":
  waiting to lock monitor 0x000000001cfc0de8 (object 0x000000076b696e80, a java.lang.String),
  which is held by "t1"
"t1":
  waiting to lock monitor 0x000000001cfc3728 (object 0x000000076b696eb8, a java.lang.String),
  which is held by "t2"

Java stack information for the threads listed above:
===================================================
"t2":
        at com.moxi.interview.study.Lock.HoldLockThread.run(DeadLockDemo.java:42)
        - waiting to lock <0x000000076b696e80> (a java.lang.String)
        - locked <0x000000076b696eb8> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:745)
"t1":
        at com.moxi.interview.study.Lock.HoldLockThread.run(DeadLockDemo.java:42)
        - waiting to lock <0x000000076b696eb8> (a java.lang.String)
        - locked <0x000000076b696e80> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:745)

Found 1 deadlock.

通过查看最后一行,我们看到 Found 1 deadlock,即存在一个死锁

标签:lockB,lockA,java,String,Thread,Lock,Dead,死锁
From: https://blog.csdn.net/m0_58617940/article/details/137083354

相关文章

  • 【Linux】线程同步{死锁/线程同步相关接口/由浅入深理解线程同步}
    文章目录1.死锁1.1概念1.2死锁的必要条件2.线程同步相关接口2.1pthread_cond_init/destroy()2.2intpthread_cond_wait2.3linux下的条件变量及其作用2.4intpthread_cond_signal/broadcast();2.5Linux下阻塞和挂起的异同2.6阻塞,挂起,和进程切换的关系3.由浅入深理解线......
  • 【Linux】生产者消费者模型{基于BlockingQueue的PC模型/RAII风格的加锁方式/串行,并行,
    文章目录1.认识PC模型2.基于BlockingQueue的PC模型2.1串行,并行,并发2.2理解linux下的并发2.2RAII风格的加锁方式2.3阻塞队列2.4深入理解pthread_cond_wait2.5整体代码1.Task.hpp2.lockGuard.hpp3.BlockQueue.hpp4.pcModel.cc3.总结PC模型1.认识PC模型知乎好文「......
  • synchronized 关键字 - 监视器monitor lock
    目录1.synchronized的特性1.1互斥1.2可重入2.synchronized使用示例2.1修饰代码块:明确指定锁那个对象2.2直接修饰普通方法:锁的SynchronizedDemo对象2.3修饰静态方法:锁的SynchronizedDemo类的对象3.Java标准库中的线程安全类1.synchronized的特性1.1互斥synchro......
  • 2.4 死锁
    12345678910111213......
  • KingbaseES LWLock buffer_mapping 等待
    在KingbaseES数据库中,会话在将数据块与共享缓冲池的缓冲区相关联时,会触发“LWLockbuffer_mapping”等待事件。这类事件涉及到一种轻量级锁(lwlock),类似于Oracle中的闩锁。这个锁在不同的数据库中可能有不同的名称,但通常被称为buffer_mapping或BufMappingLock。它主要用于实现对HAS......
  • TextBlock 的run元素
    这里第一个run的content滚滚长江东逝水,浪花淘尽英雄。是非成败转头空。青山依旧在,几度夕阳红。和第二个的Text有什么区别?<TextBlockx:Name="textblock"Width="320"Height="100"FontSize="......
  • openGauss Xlog-no-Lock-Flush
    XlognoLockFlush可获得性本特性自openGauss2.0.0版本开始引入。特性简介取消WalInsertLock争抢及WalWriter专用磁盘写入线程。客户价值在保持原有XLog功能不变的基础上,进一步提升系统性能。特性描述对WalInsertLock进行优化,利用LSN(LogSequenceNumber)及LRC(LogRecor......
  • Yolov8-pose关键点检测:block涨点篇 | PKIBlock多尺度卷积核,优势无需膨胀,即插即用小目
      ......
  • hdu1195 Open the Lock
    双向广搜的没写,这个是普通bfs,哪天改一下……#include<iostream>#include<algorithm>#include<string>#include<queue>#include<cstring>usingnamespacestd;intT,vis[10000];stringst,en;intdir[2]={-1,1};typedefstruct{ stringa;......
  • ReentrantLock 原理
    (一)、非公平锁实现原理1、加锁解锁流程先从构造器开始看,默认为非公平锁实现publicReentrantLock(){sync=newNonfairSync();}NonfairSync继承自AQS没有竞争时加锁流程构造器构造,默认构造非公平锁(无竞争,第一个线程尝试加锁时)加锁,luck(),finalvoidlo......