首页 > 其他分享 >死锁

死锁

时间:2023-04-11 11:44:45浏览次数:35  
标签:Thread LockClass 死锁 lock1 new public

1. 死锁概念

也就是两个线程在各自拥有锁的情况下,又去尝试获取对方的锁,从而造成的一直阻塞的情况。

如下,如果此时有一个线程A,按照先锁a再获得锁b的的顺序获得锁,而在此同时又有另外一个线程B,按照先锁b再锁a的顺序获得锁

                                      

 

 

 2. 如何查看是否死锁

死锁代码

public class TestLock1 {

    public static void main(String[] args) {
        new Thread(() -> {
            // new了一个ClassLock1对象
            new LockClass().lock1();
        }).start();
        new Thread(() -> {
            // new了一个ClassLock1对象
            new LockClass1().lock1();
        }).start();
    }



}
class LockClass{
    public static synchronized void lock1(){
        System.out.println("LockClass.lock1");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LockClass1.lock1();
    }

    public static synchronized void lock2(){
        System.out.println("lock2");
    }
}

class LockClass1{
    public static synchronized void lock1(){
        System.out.println("LockClass1.lock1");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LockClass.lock1();
    }
}
View Code

2.1 jstack

Ideal terminal中通过jps -l找到对应进程

 

 输入jstack 进程号

jstack 7040

 

 会得到如下死锁内容

 

 

2.2 jconsole

Win+R运行命令jconsole 

 

 

 

 

 

 

 

 

 

3. 如何解决死锁

3.1 lock设置锁超时机制

当使用synchronized关键词提供的内置锁时,只要线程没有获得锁,那么就会永远等待下去,然而Lock接口提供了boolean tryLock(long time, TimeUnit unit) throws InterruptedException方法,该方法可以按照固定时长等待锁,因此线程可以在获取锁超时以后,主动释放之前已经获得的所有的锁。通过这种方式,也可以很有效地避免死锁

3.2 可重入锁

可重入锁解决的是同一个线程再重复获取同一把锁过程中形成死锁的问题

synchronized Reentrantlock都是可重入锁。

3.3 按顺序来获取锁

为解决如第二节中死锁的例子我们可以给锁编号,每个线程都按照锁的编号获取锁,都先调用LockClass  再调用LockClass1

public class TestLock1 {

    public static void main(String[] args) {
        new Thread(() -> {
            // new了一个ClassLock1对象
            new LockClass().lock1();
        }).start();
        new Thread(() -> {
            // new了一个ClassLock对象
            new LockClass().lock1();
        }).start();
    }



}
class LockClass{
    public static synchronized void lock1(){
        System.out.println("LockClass.lock1");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LockClass1.lock1();
    }

    public static synchronized void lock2(){
        System.out.println("lock2");
    }
}

class LockClass1{
    public static synchronized void lock1(){
        System.out.println("LockClass1.lock1");
        try {
            Thread.sleep(2000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        LockClass.lock1();
    }
}
View Code

 

3.4 如果不同线程并发存取多个表,由于存的过程会获取多个表锁资源,容易造成死锁,尽量约定以相同顺序访问表

 

3.5同一个事务中,尽可能做到一次锁定所需要的所有资源,减少死锁产生概率

 

 

参考文献:

https://blog.csdn.net/qq_40306697/article/details/125313750

 

 

 

 

标签:Thread,LockClass,死锁,lock1,new,public
From: https://www.cnblogs.com/enhance/p/17305730.html

相关文章

  • JUC并发编程基础篇第四章之公平锁/重入锁/死锁[常见锁的基本认识]
    @目录1、公平锁/非公平锁1.1、概念1.2、非公平锁代码案例1.3、公平锁代码案例1.4、面试题:为什么会有这样的公平锁和非公所这样的设计2、重入锁2.1、简介2.2、没有重入锁,会发生什么问题2.3、可重入锁的种类2.3.1、隐式锁2.3.2、显式锁2.4、面试题:可重入锁的实现机制3、死锁3.1......
  • 使用jstack排查JVM进程死锁
    前言在Linux系统使用JDK自带的jstack指令分析输出的线程信息排查死锁的详细步骤。例子程序下面是一个模拟线程死锁的例子程序,编译(javacDeadLockSample.java)后执行(javaDeadLockSample)这个程序来启动一个JVM进程。其中一个线程会成功获取到DeadLockSample的Class对象锁持续打......
  • freeRTOS任务死锁
    一、freeRTOS任务死锁FreeRTOS任务死锁是一种常见的问题,通常发生在多个任务相互等待对方释放资源的情况下。以下是一个简单的例子,用于说明FreeRTOS任务死锁的情况:假设有两个任务Task1和Task2,它们需要共享两个资源ResourceA和ResourceB。每个任务都需要同时访问这两个资源才能完成它......
  • SQLSERVER 语句交错引发的死锁研究
    一:背景1.讲故事相信大家在使用SQLSERVER的过程中经常会遇到阻塞和死锁,尤其是死锁,比如下面的输出:(1rowaffected)Msg1205,Level13,State51,Line5Transaction(ProcessID62)wasdeadlockedonlockresourceswithanotherprocessandhasbeenchosenasthed......
  • 死锁(deadlock)
    线程死锁的必备要素互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待;不可剥夺条......
  • 什么是线程死锁
    死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产......
  • 死锁
    四个必要条件(1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问,只能等待,直到进程使用完成后释放该资源;(2)请求保持条件:进程获得一定资源后,又对其他资源发出......
  • mysql查看死锁
    查看死锁Mysql查询是否存在锁表有多种方式,这里只介绍一种最常用的。1、查看正在进行中的事务SELECT*FROMinformation_schema.INNODB_TRX2、查看正在锁的事务......
  • 死锁产生的原因及避免死锁的方法
    死锁产生的原因:两个进程都拿着对方需要的资源不放,而形成相互等待。如果不同程序会并发存取多个表/资源,尽量约定以相同的顺序访问表/资源,可以大大降低发生死锁的可能性......
  • 死锁
    死锁死锁怎么产生的两个或多个线程,互相拥有对方需要的资源,又互相抢占对方的资源,又不肯释放自己的资源,这就造成了死锁。java中怎么造成死锁的出现了锁的嵌套,解决办法就......