zoukankan      html  css  js  c++  java
  • java多线程--死锁

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

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

  • 相关阅读:
    51单片机数码管字符H自右向左移动
    51单片机点亮双向流水灯
    React 动态增减表单项
    React--Tree 点击节点收缩
    Redis 操作异常
    Linxu 后台运行
    vert.x学习(四),使用模板解析器ClassLoaderTemplateResolver
    vert.x学习(三),Web开发之Thymeleaf模板的使用
    vert.x学习(二),使用Router来定义用户访问路径
    vert.x学习(一),开篇之hello world
  • 原文地址:https://www.cnblogs.com/BonnieWss/p/10511496.html
Copyright © 2011-2022 走看看