美文网首页
一段模拟死锁并中断死锁线程的demo

一段模拟死锁并中断死锁线程的demo

作者: 江江的大猪 | 来源:发表于2017-11-01 20:46 被阅读27次

Demo

public class DeadLock implements Runnable{
    public static ReentrantLock lock1 = new ReentrantLock();
    public static ReentrantLock lock2 = new ReentrantLock();
    public int flag;
    public DeadLock(int flag) {
        this.flag = flag;
    }
    @Override
    public void run() {
        if (flag == 1) {
            try {
                lock1.lockInterruptibly();
                Thread.sleep(2000);
                lock2.lockInterruptibly();
            } catch (InterruptedException e) {
                System.out.println("flag=1被中断了");
            } finally {
                if (lock1.isHeldByCurrentThread()) {
                    lock1.unlock();
                }
                if (lock2.isHeldByCurrentThread()) {
                    lock2.unlock();
                }
            }
        }
        if (flag == 2) {
            try {
                lock2.lockInterruptibly();
                Thread.sleep(2000);
                lock1.lockInterruptibly();
            } catch (InterruptedException e) {
                System.out.println("flag=2被中断了");
            } finally {
                if (lock1.isHeldByCurrentThread()) {
                    lock1.unlock();
                }
                if (lock2.isHeldByCurrentThread()) {
                    lock2.unlock();
                }
            }
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread thread1 = new Thread(new DeadLock(1));
        Thread thread2 = new Thread(new DeadLock(2));
        thread1.start();
        thread2.start();
        Thread.sleep(5000);
        ThreadMXBean mxBean = ManagementFactory.getThreadMXBean();
        long[] deadlockedThreads = mxBean.findDeadlockedThreads();
        if (deadlockedThreads != null) {
            for (Thread thread : Thread.getAllStackTraces().keySet()) {
                for (long deadThreadId : deadlockedThreads) {
                    if (deadThreadId == thread.getId()) {
                        thread.interrupt();
                    }
                }
            }
        }
    }
}
肥肥小浣熊

相关文章

  • 一段模拟死锁并中断死锁线程的demo

    Demo

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

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

  • JavaEE面试题总结 Day39 2018-12-29

    什么是线程死锁?死锁如何产生?如何避免线程死锁? 死锁的介绍: 线程死锁是指由于两个或者多个线程互相持有对方所需要...

  • 多线程之_死锁

    基本介绍 多个线程都占用了对方的锁资源、但不肯想让、导致了死锁、再编程上一定要避免死锁的发生。 死锁demo 结果

  • Python中的各种锁

    Python之死锁 死锁分为两种情况,多进程/线程的死锁.或者是单线程的死锁. 1.首先看一下单线程的死锁,单线程...

  • 死锁

    线程饥饿死锁 锁顺序死锁 动态锁顺序死锁通过锁顺序来避免死锁 避免死锁

  • 死锁 deadLock

    什么是死锁 如果两个线程互相持有对方获得的锁 并尝试获得对方的那把锁 就会造成死锁 死锁的示例代码 死锁如何使用j...

  • 5. 死锁

    线程死锁 死锁是两个或更多线程阻塞着等待其它处于死锁状态的线程所持有的锁。死锁通常发生在多个线程同时但以不同的顺序...

  • 线程同步中的死锁

    何为死锁 多线程各自持有不同的锁,并互相试图获取对方已持有的锁,导致无限等待的状况,称为死锁。比如: 避免死锁 避...

  • Java多线程之死锁(Deadlock)及死锁避免(Deadlo

    线程死锁(Thread Deadlock) 数据库死锁(Database Deadlocks) 死锁避免 (Dea...

网友评论

      本文标题:一段模拟死锁并中断死锁线程的demo

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