产生死锁的4个必要条件
互斥条件
一个资源每次只能被一个线程使用
不可剥夺条件
线程已获得的资源,在未使用完之前,不能强制剥夺
请求与保持条件
线程因请求资源而阻塞时,对已获得的资源保持不放
循环等待条件
若干线程之间循环等待
如果查看线程死锁
jps 查进程号
jstack vmid
thread-1
at com.xx.xxx.xxx.run(yyy.java:44)
- waiting to lock <0x000000071685bdd8>
- locked <0x000000071685bde8>
at java.lang.Thread.run(Thread.java:748)
thread-0
at com.xx.xxx.xxx.run(yyy.java:35)
- waiting to lock <0x000000071685bde8>
- locked <0x000000071685bdd8>
at java.lang.Thread.run(Thread.java:748)
Found 1 deadlock.
---------------------------------------
两个线程操作数据库,数据库发生了死锁
查询是否锁表
show OPEN TABLES where In_use > 0;
查进程
show processlist;
查正在锁的事务
select * from information_schema.innodb_locks;
查等待锁的事务
select * from information_schema.innodb_lock_waits;