【JAVA】死锁的产生和解决思路
程序员文章站
2022-04-17 18:30:16
...
package p12.thread;
public class DeadLockTest {
/*
* 模拟死锁的产生
*/
public static void main(String[] args) {
/*
* 两个锁对象
*/
Object o1 = new Object();
Object o2 = new Object();
/*
* 两个线程
* t1持有o1,等待o2
* t2持有o2,等待o1
*/
Thread t1 = new Thread(()->{
synchronized(o1) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o2) {
System.out.println("11111");
}
}
});
Thread t2 =new Thread(()->{
synchronized(o2) {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized(o1) {
System.out.println("2222");
}
}
});
t1.start();
t2.start();
}
/*
* 死锁的解决办法:
* >通过加锁顺序
* 每个线程都使用相同的顺序获取锁
* 例如:
* 让以上例子中的t1、t2线程都先获取锁o1,再获取锁o2。
* 这种方法需要事先知道所有会用到的锁,并对这些锁做适当的排序。
*
* >通过加锁时限
* 当一个线程持有锁的时间达到一定值时,wait释放锁,等待一段随机的时间再重试。
* 这种方法需要自己创建一个自定义锁(java.util.concurrent)
*
* >死锁检测
* 通过遍历锁关系来检测是否有死锁发生,
* 例如:
* A线程持有a锁,现在需要b锁,通过遍历锁关系检测到B线程持有b锁且需要a锁时时,就释放所有锁等待一段时间后重试(wait)
*/
}
上一篇: 142. python连接rediscluster集群
下一篇: 137. Redis 数据类型
推荐阅读
-
详解java中产生死锁的原因及如何避免
-
java多线程学习之死锁的模拟和避免(实例讲解)
-
java web在高并发和分布式下实现订单号生成唯一的解决方案
-
Java反转字符串和相关字符编码的问题解决
-
java多线程学习之死锁的模拟和避免(实例讲解)
-
sql server 2000阻塞和死锁问题的查看与解决方法
-
解决Java中的强制类型转换和二进制表示问题
-
Tomcat无法加载css和js等静态资源文件的解决思路
-
windows安装多个版本的jdk,解决java-version和javac-version版本不一致的问题
-
java学习(这两天在看线程,进程,和传值参数看的没有思路不知道写什么,今天有点就写点)