死锁
死锁是什么
大学课程中的四个要素:
(1)互斥(2)不可抢占(3)循环等待(4)请求保持
也就是下图所描述
产生死锁的主要原因
(1)系统资源不足(2)进程运行推进的顺序不合适(3)资源分配不当
【也就是不满足四要素】
产生死锁代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
| package com.atguigu.test_deadlock;
import java.util.concurrent.TimeUnit;
class HoldLock implements Runnable{
private String lockA; private String lockB;
public HoldLock(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); } } } }
* @author zhudunfeng * @date 2020/8/20 22:54 * 死锁是指两个或两个以上的进程在执行过程中, * 因为抢夺资源而造成的一种互相等待的现象, * 若无外力干预那么它们将无法推进下去 */ public class DeadLockDemo { public static void main(String[] args) { String lockA="lockA"; String lockB="lockB"; new Thread(new HoldLock(lockA, lockB),"ThreadAAA").start(); new Thread(new HoldLock(lockB, lockA),"ThreadBBB").start();
* 怎样定位死锁位置 * linux ps -ef|grep xxx ls -l * windows下的java运行程序 也有类似ps的查看进程的命令,但是目前我们查看的只是java * jps= java ps jps -l 查询进程号 * jstack 进行号 */ } }
|
解决与定位死锁
第一步:
jps命令定位进程编号
第二步
jstack找到死锁查看