java多线程--死锁
2024-08-29 04:01:07
1. Java中导致死锁的原因
Java中死锁最简单的情况是,一个线程T1持有锁L1并且申请获得锁L2,而另一个线程T2持有锁L2并且申请获得锁L1,因为默认的锁申请操作都是阻塞的,所以线程T1和T2永远被阻塞了。导致了死锁。这是最容易理解也是最简单的死锁的形式。但是实际环境中的死锁往往比这个复杂的多。可能会有多个线程形成了一个死锁的环路,比如:线程T1持有锁L1并且申请获得锁L2,而线程T2持有锁L2并且申请获得锁L3,而线程T3持有锁L3并且申请获得锁L1,这样导致了一个锁依赖的环路:T1依赖T2的锁L2,T2依赖T3的锁L3,而T3依赖T1的锁L1。从而导致了死锁。
从这两个例子,我们可以得出结论,产生死锁可能性的最根本原因是:线程在获得一个锁L1的情况下再去申请另外一个锁L2,也就是锁L1想要包含了锁L2,也就是说在获得了锁L1,并且没有释放锁L1的情况下,又去申请获得锁L2,这个是产生死锁的最根本原因。另一个原因是默认的锁申请操作是阻塞的。
public class DeadLock{
private static final Integer a=10;
private static final Integer b=20; public void getA(){
synchronized (a){
try{
Thread.sleep(10l);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (b){
System.out.println("Thread is "+Thread.currentThread().getName()+" "+", a is "+a);
}
}
} public void getB(){
synchronized (Integer.valueOf(b)){
try{
Thread.sleep(10l);
}catch (InterruptedException e){
e.printStackTrace();
}
synchronized (Integer.valueOf(a)){
System.out.println("Thread is "+Thread.currentThread().getName()+", b is "+b);
}
}
} }
测试:
DeadLock deadLock=new DeadLock();
for(int i=0;i<50;i++){
Thread thread=new Thread(new Runnable() {
@Override
public void run() {
deadLock.getA();
}
});
thread.start(); Thread thread1=new Thread(new Runnable() {
@Override
public void run() {
deadLock.getB();
}
});
thread1.start();
}
结果不会打印任何东西,产生了死锁。
最新文章
- JQuery中的siblings()是什么意思
- PC虚拟现实应用的性能分析与优化:从CPU角度切入
- 【HTML5】嵌入另一张HTML文档、通过插件嵌入内容、嵌入数字表现形式
- Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析
- document.compatMode属性和获取鼠标的位置
- java问题整理
- ACM之跳骚---ShinePans
- SpringMVC RequestMapping 详解
- oracle学习笔记(六) JDBC使用
- Java 初始化、final、清理
- Android利用Intent与其他应用交互
- spring activemq 整合
- JMeter中BeanShell断言使用一
- 深入学习 FutureTask
- 设计Popup Window
- Win10系统下编译OSG3.4
- Python 使用Pandas读取Excel的学习笔记
- Apache服务器运维笔记(3)----容器部分
- 如何指定安装webpack
- 【DFS】Paintball(6-22)