美文网首页
Java死锁

Java死锁

作者: WilsonMing | 来源:发表于2018-07-20 11:24 被阅读45次
  • 什么是死锁
  • 死锁检测
  • 产生死锁的四个必要条件
  • 如何避免死锁

死锁

死锁,指两个或多个线程之间,由于互相持有对方需要的锁,而永久处于阻塞的状态。


死锁
  • 死锁示例代码
public class DeadLockSimple extends Thread {
    private String first;
    private String second;

    public DeadLockSimple(String name, String first, String second) {
        super(name);
        this.first = first;
        this.second = second;
    }

    @Override
    public void run() {
        super.run();
        synchronized (first) {
            System.out.println(this.getName() + ",obtained1:" + first);

            try {
                Thread.sleep(1000L);
                synchronized (second) {
                    System.out.println(this.getName() + ",obtained2:" + second);
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        }

    }

    public static void main(String[] args) {
        //死锁检测
        ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
        Runnable dlCheck = new Runnable() {
            @Override
            public void run() {
                long[] threadIds = mxBean.findDeadlockedThreads();
                if (threadIds != null) {
                    ThreadInfo[] threadInfos = mxBean.getThreadInfo(threadIds);
                    System.out.println("Detected deadlock threads:");
                    for (ThreadInfo threadInfo : threadInfos) {
                        System.out.println(threadInfo.getThreadName());
                    }
                }
            }
        };
        ScheduledExecutorService scheduledExecutorService= Executors.newScheduledThreadPool(1);
        scheduledExecutorService.scheduleAtFixedRate(dlCheck,5L,10L, TimeUnit.SECONDS);
        //死锁示例
        String lockA = "lockA";
        String lockB = "lockB";
        DeadLockSimple t1 = new DeadLockSimple("thread1", lockA, lockB);
        DeadLockSimple t2 = new DeadLockSimple("thread2", lockB, lockA);
        t1.start();
        t2.start();
        try {
            t1.join();
            t2.join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

输出

thread2,obtained1:lockB
thread1,obtained1:lockA
Detected deadlock threads:
thread2
thread1

死锁检测:通过相关工具检测死锁。

  • Jstack命令
  • JConsole工具

产生死锁的四个必要条件

  • 互斥条件:一个资源每次只能被一个进程使用。
  • 占有且等待:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  • 没有强行占有:进程已获得的资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

如何避免死锁

  • 加锁顺序:确保所有的线程都是按照相同的顺序获得锁,那么死锁就不会发生


    image.png
  • 加锁时限:尝试获取锁的时候加一个超时时间,这也就意味着在尝试获取锁的过程中若超过了这个时限该线程则放弃对该锁请求


    image.png

相关文章

  • Java死锁检测之ThreadMXBean

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

  • Java concurrency《防止死锁》

    Java concurrency《防止死锁》 常见预防死锁的办法 有顺序的锁 具有超时时间的锁 死锁的检测 有顺序...

  • 如何去检测死锁

    如何检测死锁 死锁预防 让线程获取锁的顺序一致 死锁检测 jps 查看java 进程信息 jstack +进程号 ...

  • 死锁

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

  • Java死锁的简单例子

    Java死锁的简单例子 两个线程互相占有对方需要的资源而不释放,便形成了死锁。 代码如下:Program.java...

  • JVM_JMM: 死锁的检测

    死锁的示例代码: 通过jconsole来检测死锁: 名称: Thread-1状态: java.lang.Class...

  • java死锁介绍、源码实现及预防(含源码)

    java死锁介绍、源码实现及预防(含源码) 什么是死锁 死锁是 多个线程 之间 相互之间 持有 对方需要的资源,同...

  • Java高并发 -- 并发扩展

    Java高并发 -- 并发扩展 主要是学习慕课网实战视频《Java并发编程入门与高并发面试》的笔记 死锁 死锁是指...

  • Java死锁检测方式JConsole

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

  • Java死锁

    什么是死锁 死锁检测 产生死锁的四个必要条件 如何避免死锁 死锁 死锁,指两个或多个线程之间,由于互相持有对方需要...

网友评论

      本文标题:Java死锁

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