美文网首页
Java中死锁分析

Java中死锁分析

作者: Bury丶冬天 | 来源:发表于2020-06-08 10:16 被阅读0次
  • 产生死锁的四个条件
    1.要有锁
    2.要有拿了一个锁的同时又等待另一个锁
    3.循环等待
    4.无限等待
  • 产生死锁的一段代码,银行转账
void transfer(Account from,Account to,int amount){
    synchronized(from){
        synchronized(to){
            //减钱
            from.setAmount(from.getAmount-amount);
            //加钱
            to.setAmount(from.getAmount+amount);
        }
    }
}

当上面的代码在两个线程中执行时
A线程执行 transfer(userA,userB,100);
B线程执行 transfer(userB,userA,100);
可能会发生死锁的情况,死锁发生在
当A线程在锁住userA的时候 B线程同时锁住了userB
然后当A线程去锁userB的时候发生等待,此时B线程也去锁userA,出现死锁。
解决办法:
1.消除循环等待,
按照用户的id的先后顺序去锁住用户对象,让其不出现循环等待
即:修改代码如下

void transfer(Account from,Account to,int amount){
    Account  temp1;
    Account  temp2;
    if(from.getId>to.getId){
        temp1=from;
        temp2=to;
    }else{
        temp1=to;
        temp2=from;
    }
    synchronized(temp1){
        synchronized(temp2){
            //减钱
            from.setAmount(from.getAmount-amount);
            //加钱
            to.setAmount(from.getAmount+amount);
        }
    }
}

2.设立超时机制(用户体验不友好)
3.其他方式(待研究)

相关文章

  • Java中死锁分析

    产生死锁的四个条件1.要有锁2.要有拿了一个锁的同时又等待另一个锁3.循环等待4.无限等待 产生死锁的一段代码,银...

  • 2021-04-24 死锁的条件

    效果如下 查看java进程 查看死锁分析

  • Java死锁分析

    死锁是多进程环境下的一种假死现象,即产生死锁的进程都处于等待状态。只要满足了下面四个必要条件,就有可能产生死锁: ...

  • Java死锁检测之ThreadMXBean

    看此文章前请先了解之前一篇文章 "Java死锁之理解死锁" 中的死锁示例java 中提供了可以检测死锁的工具类Th...

  • 多线程分析——死锁代码demo

    前言 本文主要是对Java多线程死锁代码demo的分析,对其过程以及死锁进行了大致的概括,希望对大家有帮助。 死锁...

  • 多线程练习--死锁

    关于java的死锁可能网上一大堆的代码,作为初学者我觉得还是很有必要练习下,亲自实现,并分析其死锁的原理。 死锁的...

  • 死锁

    在JAVA编程中,有3种典型的死锁类型: 静态的锁顺序死锁 动态的锁顺序死锁 协作对象之间发生的死锁 静态的锁顺序...

  • Java死锁检测方式JConsole

    Java死锁检测方式之JConsole 我们在开发中应该尽量避免死锁,但是如果真的有死锁产生那么我们怎么在一个复杂...

  • Android死锁的场景有哪些?

    常见的死锁的场景 下面分析几种常见的死锁形式: 锁顺序死锁 上述代码中,如果一个线程调用lockAtoB(),另一...

  • Java中的死锁

    定义两个或者两个以上的线程在执行的过程中,因资源竞争造成的相互等待,无法继续执行下去。 造成死锁的原因系统资源的竞...

网友评论

      本文标题:Java中死锁分析

      本文链接:https://www.haomeiwen.com/subject/khiazhtx.html