摘要:模拟出一个死锁现场,然后用中断来处理死锁普通的是不能响应中断的,能够响应中断线程退出启动发生死锁,线程得到,线程得到,然后彼此又想获得对方的锁命令查看检查死锁线程并中断检查死锁查看当前运行的线程查看线程栈上的信息
package com.sky.d_contracting_out; import java.lang.management.ManagementFactory; import java.lang.management.ThreadInfo; import java.lang.management.ThreadMXBean; import java.util.concurrent.locks.ReentrantLock; /** * 模拟出一个死锁现场,然后用中断来处理死锁 */ public class DeadLockDemo implements Runnable { public static ReentrantLock l1 = new ReentrantLock(); public static ReentrantLock l2 = new ReentrantLock(); private int lock; public DeadLockDemo(int lock) { this.lock = lock; } @Override public void run() { try { if(lock == 1){ //普通的lock.lock()是不能响应中断的,lock.lockInterruptibly()能够响应中断 l1.lockInterruptibly(); Thread.sleep(500); l2.lockInterruptibly(); } else { l2.lockInterruptibly(); Thread.sleep(500); l1.lockInterruptibly(); } } catch (Exception e) { } finally { if(l1.isHeldByCurrentThread()){ l1.unlock(); } if(l2.isHeldByCurrentThread()){ l2.unlock(); } System.out.println("线程退出"); } } public static void main(String[] args) throws InterruptedException { Thread t1 = new Thread(new DeadLockDemo(1)); Thread t2 = new Thread(new DeadLockDemo(2)); t1.start(); t2.start(); Thread.sleep(1000); //启动:发生死锁,线程1得到l1,线程2得到l2,然后彼此又想获得对方的锁:jps jsatck命令查看 //检查死锁线程并中断 //DeadlockChecker.check(); } /** 检查死锁 */ static class DeadlockChecker { private final static ThreadMXBean mbean = ManagementFactory.getThreadMXBean(); final static Runnable deadLockChecker = new Runnable() { @Override public void run() { while(true){ long[] deadLockedThreadIds = mbean.findDeadlockedThreads(); if(deadLockedThreadIds != null){ ThreadInfo[] threadInfos = mbean.getThreadInfo(deadLockedThreadIds); for(Thread t : Thread.getAllStackTraces().keySet()){ for(ThreadInfo ti : threadInfos){ if(ti.getThreadId() == t.getId()){ t.interrupt(); } } } } try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } } } }; public static void check() { Thread t = new Thread(deadLockChecker); t.setDaemon(true); t.start(); } } }
jps:查看当前运行的java线程
jstack:查看线程栈上的信息
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/70079.html
摘要:以下各节描述由处理程序跟踪的数据线程转储检测死锁堆摘要线程转储线程转储由线程堆栈包括线程状态组成用于虚拟机中的所有线程。线程转储不会终止应用程序在打印线程信息之后它将继续。检测死锁除了线程堆栈之外控件中断处理程序还执行死锁检测算法。 2.19 Control + Break 处理程序在 Oracle Solaris 或 Linux 操作系统上, 在应用程序控制台 (标准输入) 中按下C...
摘要:实现原理是通过基于单链表的条件队列来管理等待线程的。中断在转移到同步队列期间或之后发生,此时表明有线程正在调用转移节点。在该种中断模式下,再次设置线程的中断状态。 1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口。Condition声明了一组等待/通知的方法,这些方法的功能与Objec...
摘要:实现原理是通过基于单链表的条件队列来管理等待线程的。中断在转移到同步队列期间或之后发生,此时表明有线程正在调用转移节点。在该种中断模式下,再次设置线程的中断状态。 1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口。Condition声明了一组等待/通知的方法,这些方法的功能与Objec...
摘要:实现原理是通过基于单链表的条件队列来管理等待线程的。中断在转移到同步队列期间或之后发生,此时表明有线程正在调用转移节点。在该种中断模式下,再次设置线程的中断状态。 1. 简介 Condition是一个接口,AbstractQueuedSynchronizer 中的ConditionObject内部类实现了这个接口。Condition声明了一组等待/通知的方法,这些方法的功能与Objec...
摘要:通过指令重排可以减少流水线停顿提升巨大效率原则程序顺序原则一个线程内保证语义的串行性。锁规则解锁必然发生在随后的加锁前。线程的方法先于它的每一个动作。 1. 基本概念 同步(Synchronous)和异步(Asynchronous) 并发(Conncurrency)和并行(Parallelism) 临界区 阻塞(Blocking)与非阻塞(Non-Blocking) 死锁(Deadl...
阅读 3581·2023-04-26 02:55
阅读 2849·2021-11-02 14:38
阅读 4135·2021-10-21 09:39
阅读 2842·2021-09-27 13:36
阅读 3943·2021-09-22 15:08
阅读 2643·2021-09-08 10:42
阅读 2802·2019-08-29 12:21
阅读 667·2019-08-29 11:22