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();
}

结果不会打印任何东西,产生了死锁。

最新文章

  1. JQuery中的siblings()是什么意思
  2. PC虚拟现实应用的性能分析与优化:从CPU角度切入
  3. 【HTML5】嵌入另一张HTML文档、通过插件嵌入内容、嵌入数字表现形式
  4. Spring与Mybatis整合的MapperScannerConfigurer处理过程源码分析
  5. document.compatMode属性和获取鼠标的位置
  6. java问题整理
  7. ACM之跳骚---ShinePans
  8. SpringMVC RequestMapping 详解
  9. oracle学习笔记(六) JDBC使用
  10. Java 初始化、final、清理
  11. Android利用Intent与其他应用交互
  12. spring activemq 整合
  13. JMeter中BeanShell断言使用一
  14. 深入学习 FutureTask
  15. 设计Popup Window
  16. Win10系统下编译OSG3.4
  17. Python 使用Pandas读取Excel的学习笔记
  18. Apache服务器运维笔记(3)----容器部分
  19. 如何指定安装webpack
  20. 【DFS】Paintball(6-22)

热门文章

  1. mysql查询中字符串转换成数字
  2. C++中复制构造函数被调用的三种情况
  3. Wannafly挑战赛13 zzf的好矩阵 题解 答案解释
  4. 1级搭建类109-Oracle 12cR2 SI FS(Windows Server 2019)公开
  5. Linux安装U盘启动报错Failed to load ldlinux.c32
  6. R语言函数化编程笔记2
  7. bfs(队列模板)
  8. JavaDay3(上)
  9. CodeForces 1144A
  10. Ubuntu系统Apache2部署SSL证书