b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

java线程死锁检测

电脑杂谈  发布时间:2020-05-30 18:01:13  来源:网络整理

避免线程死锁_java多线程避免死锁_线程死锁

线程1持有锁A并申请锁B时java多线程避免死锁,此时线程2持有锁B并申请锁A,将导致进程死锁. 在这种情况下,除非手动终止Java进程,否则这两个线程将无法打破死锁.

线程死锁_java多线程避免死锁_避免线程死锁

image.png

当多个线程需要申请多个资源时java多线程避免死锁,如果应用资源的顺序相同,则可以保证只有一个线程可以随时获取所有资源,而其他线程必须等待当前线程释放所有资源. 重新获取锁.

java多线程避免死锁_避免线程死锁_线程死锁

image.png

避免线程死锁_线程死锁_java多线程避免死锁

尽管多线程可以通过按固定顺序请求资源来避免死锁,但实际的业务场景正在不断变化,并且难以保证它们始终处于理想状态.

仅当检测到死锁状态时,才能执行目标业务处理.

避免线程死锁_java多线程避免死锁_线程死锁

ThreadMXBean是java.lang.management包提供的工具类,可以通过ThreadMXBean类的findDeadlockedThreads()方法获取死锁线程号.

public class DeadLockDemo {
    private Object lock1 = new Object();
    private Object lock2 = new Object();
    public void doActionA() {
        synchronized (lock1) {
            System.out.println(Thread.currentThread() + ": acquire lock1");
            try {
                // 线程阻塞,让其他线程拿到lock2
                Thread.sleep(10);
            } catch (Exception e) {
            }
            synchronized (lock2) {
                System.out.println(Thread.currentThread() + ": acquire lock2");
            }
        }
    }
    public void doActionB() {
        synchronized (lock2) {
            System.out.println(Thread.currentThread() + ": acquire lock2");
            synchronized (lock1) {
                System.out.println(Thread.currentThread() + ": acquire lock1");
            }
        }
    }
    public static void main(String[] args) {
        Thread monitorThread = new Thread(new Runnable() {
            @Override
            public void run() {
                while (true) {
                    ThreadMXBean tmx = ManagementFactory.getThreadMXBean();
                    long[] ids = tmx.findDeadlockedThreads();
                    if (ids != null) {
                        ThreadInfo[] tmxThreadInfo = tmx.getThreadInfo(ids, true, true);
                        System.out.println("The following threads are deadlocked:");
                        for (ThreadInfo ti : tmxThreadInfo) {
                            System.out.println(ti);
                        }
                        break;
                    }
                }
            }
        });
        monitorThread.start();
        DeadLockDemo demo = new DeadLockDemo();
        Thread thread1 = new Thread(new Runnable() {
            @Override
            public void run() {
                demo.doActionA();
            }
        });
        Thread thread2 = new Thread(new Runnable() {
            @Override
            public void run() {
                demo.doActionB();
            }
        });
        thread1.start();
        thread2.start();
    }
}

总是很难避免死锁的发生,并且只有在设计多个线程时才能充分考虑死锁的风险. 对于业务要求严格的场景,可以采用必要的死锁检测机制,以确保系统的健壮性.


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-227886-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      • 景宗王曦
        景宗王曦

        自己没理由把伊拉克打碎了还在干协别人站队

      热点图片
      拼命载入中...