Java多线程之死锁编码及定位分析

目录
死锁是什么
代码实现
死锁解决办法
1. 死锁是什么
死锁是指两个或两个以上的进程在执行过程中因争夺资而造成的一种互相等待的现象,若无外力干涉那它们都将无法推进下去,
如果系统资源允是,进程的资源请求都能够得到满是,死锁出现的可能性就很低,否则就会因争夺有限的资源而陷入死锁。2. 代码实现
代码实现

1import java.util.concurrent.TimeUnit; 2 3class HoldLockThread implements Runnable{ 4 5    private String lockA; 6    private String lockB; 7 8    public HoldLockThread(String lockA, String lockB) { 9        this.lockA = lockA; 10        this.lockB = lockB; 11    } 12 13    @Override 14    public void run() { 15        synchronized (lockA){ 16            System.out.println(Thread.currentThread().getName()+"\t 自己持有:"+lockA+"\t 尝试持有:"+lockB); 17            //暂停一会儿线程 18            try { 19                TimeUnit.SECONDS.sleep(1); 20            } catch (InterruptedException e) { 21                e.printStackTrace(); 22            } 23 24            synchronized (lockB){ 25                System.out.println(Thread.currentThread().getName()+"\t 自己持有:"+lockB+"\t 尝试持有:"+lockA); 26 27            } 28        } 29    } 30} 31 32public class DeadLockDemo { 33    public static void main(String[] args) { 34        String lockA = "lockA"; 35        String lockB = "lockB"; 36 37        new Thread(new HoldLockThread(lockA,lockB),"ThreadAAA").start(); 38        new Thread(new HoldLockThread(lockB,lockA),"ThreadBBB").start(); 39 40    } 41}

3. 死锁解决办法
jps命令定位进程号


jstack找到死锁查看

命令: jstack 进程号 显示结果

点赞
收藏

评论区

加载中...

相关推荐

MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1

文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

解决进程死锁——银行家算法透析

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等待的进程称为死锁进程。避免死锁算法中最有代表性的算法是DijkstraE.W于1968年提出的银行家算法:下面我们将从例题中一点一点的分析:解题:第一步:

4、jstack查看线程栈信息

1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6

PostgreSQL死锁进程及慢查询处理

1、死锁进程查看:SELECTFROMpg_stat_activityWHEREdatname'数据库名称'andwaitingtrue;pid进程id。2、慢查询SQL:selectdatname,pid,usename,application_name,client_addr,client

Java多线程之死锁编码及定位分析 - HelloWorld