成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

死鎖 - 檢測 - 中斷

superw / 1035人閱讀

摘要:模擬出一個死鎖現場,然后用中斷來處理死鎖普通的是不能響應中斷的,能夠響應中斷線程退出啟動發(fā)生死鎖,線程得到,線程得到,然后彼此又想獲得對方的鎖命令查看檢查死鎖線程并中斷檢查死鎖查看當前運行的線程查看線程棧上的信息

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);
        
        //啟動:發(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:查看當前運行的java線程

jstack:查看線程棧上的信息

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://systransis.cn/yun/70079.html

相關文章

  • Control+Break在JVM中的處理

    摘要:以下各節(jié)描述由處理程序跟蹤的數據線程轉儲檢測死鎖堆摘要線程轉儲線程轉儲由線程堆棧包括線程狀態(tài)組成用于虛擬機中的所有線程。線程轉儲不會終止應用程序在打印線程信息之后它將繼續(xù)。檢測死鎖除了線程堆棧之外控件中斷處理程序還執(zhí)行死鎖檢測算法。 2.19 Control + Break 處理程序在 Oracle Solaris 或 Linux 操作系統(tǒng)上, 在應用程序控制臺 (標準輸入) 中按下C...

    沈建明 評論0 收藏0
  • AbstractQueuedSynchronizer 原理分析 - Condition 實現原理

    摘要:實現原理是通過基于單鏈表的條件隊列來管理等待線程的。中斷在轉移到同步隊列期間或之后發(fā)生,此時表明有線程正在調用轉移節(jié)點。在該種中斷模式下,再次設置線程的中斷狀態(tài)。 1. 簡介 Condition是一個接口,AbstractQueuedSynchronizer 中的ConditionObject內部類實現了這個接口。Condition聲明了一組等待/通知的方法,這些方法的功能與Objec...

    leone 評論0 收藏0
  • AbstractQueuedSynchronizer 原理分析 - Condition 實現原理

    摘要:實現原理是通過基于單鏈表的條件隊列來管理等待線程的。中斷在轉移到同步隊列期間或之后發(fā)生,此時表明有線程正在調用轉移節(jié)點。在該種中斷模式下,再次設置線程的中斷狀態(tài)。 1. 簡介 Condition是一個接口,AbstractQueuedSynchronizer 中的ConditionObject內部類實現了這個接口。Condition聲明了一組等待/通知的方法,這些方法的功能與Objec...

    李世贊 評論0 收藏0
  • AbstractQueuedSynchronizer 原理分析 - Condition 實現原理

    摘要:實現原理是通過基于單鏈表的條件隊列來管理等待線程的。中斷在轉移到同步隊列期間或之后發(fā)生,此時表明有線程正在調用轉移節(jié)點。在該種中斷模式下,再次設置線程的中斷狀態(tài)。 1. 簡介 Condition是一個接口,AbstractQueuedSynchronizer 中的ConditionObject內部類實現了這個接口。Condition聲明了一組等待/通知的方法,這些方法的功能與Objec...

    bigdevil_s 評論0 收藏0
  • 實戰(zhàn)java高并發(fā)程序設計第一章

    摘要:通過指令重排可以減少流水線停頓提升巨大效率原則程序順序原則一個線程內保證語義的串行性。鎖規(guī)則解鎖必然發(fā)生在隨后的加鎖前。線程的方法先于它的每一個動作。 1. 基本概念 同步(Synchronous)和異步(Asynchronous) 并發(fā)(Conncurrency)和并行(Parallelism) 臨界區(qū) 阻塞(Blocking)與非阻塞(Non-Blocking) 死鎖(Deadl...

    moven_j 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<