摘要:模擬出一個死鎖現(xiàn)場,然后用中斷來處理死鎖普通的是不能響應(yīng)中斷的,能夠響應(yīng)中斷線程退出啟動發(fā)生死鎖,線程得到,線程得到,然后彼此又想獲得對方的鎖命令查看檢查死鎖線程并中斷檢查死鎖查看當(dāng)前運(yùn)行的線程查看線程棧上的信息
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; /** * 模擬出一個死鎖現(xiàn)場,然后用中斷來處理死鎖 */ 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()是不能響應(yīng)中斷的,lock.lockInterruptibly()能夠響應(yīng)中斷 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); //啟動:發(fā)生死鎖,線程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:查看當(dāng)前運(yùn)行的java線程
jstack:查看線程棧上的信息
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/70079.html
摘要:以下各節(jié)描述由處理程序跟蹤的數(shù)據(jù)線程轉(zhuǎn)儲檢測死鎖堆摘要線程轉(zhuǎn)儲線程轉(zhuǎn)儲由線程堆棧包括線程狀態(tài)組成用于虛擬機(jī)中的所有線程。線程轉(zhuǎn)儲不會終止應(yīng)用程序在打印線程信息之后它將繼續(xù)。檢測死鎖除了線程堆棧之外控件中斷處理程序還執(zhí)行死鎖檢測算法。 2.19 Control + Break 處理程序在 Oracle Solaris 或 Linux 操作系統(tǒng)上, 在應(yīng)用程序控制臺 (標(biāo)準(zhǔn)輸入) 中按下C...
摘要:實(shí)現(xiàn)原理是通過基于單鏈表的條件隊列來管理等待線程的。中斷在轉(zhuǎn)移到同步隊列期間或之后發(fā)生,此時表明有線程正在調(diào)用轉(zhuǎn)移節(jié)點(diǎn)。在該種中斷模式下,再次設(shè)置線程的中斷狀態(tài)。 1. 簡介 Condition是一個接口,AbstractQueuedSynchronizer 中的ConditionObject內(nèi)部類實(shí)現(xiàn)了這個接口。Condition聲明了一組等待/通知的方法,這些方法的功能與Objec...
摘要:實(shí)現(xiàn)原理是通過基于單鏈表的條件隊列來管理等待線程的。中斷在轉(zhuǎn)移到同步隊列期間或之后發(fā)生,此時表明有線程正在調(diào)用轉(zhuǎn)移節(jié)點(diǎn)。在該種中斷模式下,再次設(shè)置線程的中斷狀態(tài)。 1. 簡介 Condition是一個接口,AbstractQueuedSynchronizer 中的ConditionObject內(nèi)部類實(shí)現(xiàn)了這個接口。Condition聲明了一組等待/通知的方法,這些方法的功能與Objec...
摘要:實(shí)現(xiàn)原理是通過基于單鏈表的條件隊列來管理等待線程的。中斷在轉(zhuǎn)移到同步隊列期間或之后發(fā)生,此時表明有線程正在調(diào)用轉(zhuǎn)移節(jié)點(diǎn)。在該種中斷模式下,再次設(shè)置線程的中斷狀態(tài)。 1. 簡介 Condition是一個接口,AbstractQueuedSynchronizer 中的ConditionObject內(nèi)部類實(shí)現(xiàn)了這個接口。Condition聲明了一組等待/通知的方法,這些方法的功能與Objec...
摘要:通過指令重排可以減少流水線停頓提升巨大效率原則程序順序原則一個線程內(nèi)保證語義的串行性。鎖規(guī)則解鎖必然發(fā)生在隨后的加鎖前。線程的方法先于它的每一個動作。 1. 基本概念 同步(Synchronous)和異步(Asynchronous) 并發(fā)(Conncurrency)和并行(Parallelism) 臨界區(qū) 阻塞(Blocking)與非阻塞(Non-Blocking) 死鎖(Deadl...
閱讀 3581·2023-04-26 02:55
閱讀 2849·2021-11-02 14:38
閱讀 4136·2021-10-21 09:39
閱讀 2842·2021-09-27 13:36
閱讀 3943·2021-09-22 15:08
閱讀 2644·2021-09-08 10:42
閱讀 2802·2019-08-29 12:21
閱讀 667·2019-08-29 11:22