美文网首页程序员
Java中的死锁

Java中的死锁

作者: ahuustcly | 来源:发表于2018-09-09 11:06 被阅读7次
  1. 定义
    两个或者两个以上的线程在执行的过程中,因资源竞争造成的相互等待,无法继续执行下去。
  2. 造成死锁的原因
    系统资源的竞争、线程推进顺序不当等造成
  3. 产生死锁的四个必要条件
    ①互斥条件:对获取到的资源具有排它性
    ②请求和保持条件:因请求被占用的资源而阻塞时,对已获得到资源保持不放
    ③不可剥夺条件:其他进程或者线程无法抢占
    ④循环等待:当死锁发生时,所等待的进程或者线程形成环路,造成永久阻塞

4.模拟代码

    public class Deadlock {
    private static Object lockA = new Object();
    private static Object lockB = new Object();
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Thread thread1 = new Thread(new RunnableA());
        Thread thread2 = new Thread(new RunnableB());
        thread1.start();
        thread2.start();
    }

    static class RunnableA implements Runnable{
        @Override
        public void run() {
            try {
                synchronized (lockA) {
                    System.out.println("RunnableA Obtain lockA\n");
                    Thread.sleep(3000); 
                    synchronized (lockB) {
                        System.out.println("RunnableA Obtain lockB\n");
                        Thread.sleep(3000); 
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }
    
    static class RunnableB implements Runnable{
        @Override
        public void run() {
            try {
                synchronized (lockB) {
                    System.out.println("RunnableB Obtain lockB\n");
                    Thread.sleep(3000); 
                    synchronized (lockA) {
                        System.out.println("RunnableB Obtain lockA\n");
                        Thread.sleep(3000); 
                    }
                }
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
            }
        }
    }
}

5.如何避免
①加锁顺序:线程或者进程按照一定的顺序加锁
②加锁时限:线程尝试获取锁的时候添加超时机制,当超出时限则放弃对该锁的请求,并且是否自己持有的锁
③死锁检测

相关文章

  • Java死锁检测之ThreadMXBean

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

  • 死锁

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

  • Java中的死锁

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

  • Java死锁检测方式JConsole

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

  • Java中死锁分析

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

  • Java多线程-死锁的出现和解决

    Java多线程-死锁什么是死锁? 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释...

  • Java程序中的死锁

    什么是死锁? 死锁是一种特定的程序状态,主要是由于循环依赖导致彼此一直处于等待中,而使得程序陷入僵局,相当尴尬。死...

  • java中死锁的问题

    死锁。 死锁的原因:同步中嵌套同步,多个进程同时抢到不同的锁,都在等待,互不相让 在该程序中, 假如线程0在r...

  • Java中的死锁(DeadLock)

    同步会导致另一个可能的问题就是死锁(deadlock)。如果两个线程需要独占访问统一的一个资源集,而每个线程分别有...

  • 照本宣科的问题

    3条你遵循的多线程最佳实践三条最佳实践我觉得大多数Java程序员都应该遵循: 如何避免死锁?Java多线程中的死锁...

网友评论

    本文标题:Java中的死锁

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