1. 程式人生 > >併發處理:鎖,寫一個死鎖的例項和執行緒監控

併發處理:鎖,寫一個死鎖的例項和執行緒監控

鎖是一個非常有用的工具,運用的場景非常多,因為他使用起來非常的簡單,而且易於理解。但是,鎖的問題就是很可能會出現一個非常壞的事情,就是一旦造成死鎖,就會導致執行緒得不到釋放,一旦死鎖的執行緒出現的太多,就會造成系統的不可用。

一、死鎖的例子

學習掌握一個概念,最好的方法就是去寫一個例子。
複製出去,即可立馬驗證了。

package com.newframe.controllers.api;

/**
 * @author:wangdong
 * @description:測試死鎖
 */
public class TestDeadlock {

    private
static String A = "A"; private static String B = "B"; public static void main(String[] args) { new TestDeadlock().deadLock(); } private void deadLock(){ //建立一個執行緒t1 Thread t1 = new Thread(new Runnable() { @Override public void run() { synchronized
(A){ try{ //因為程式是以多執行緒的方式執行的,所以這裡有意睡眠,不釋放資源,是為了造成死鎖 Thread.sleep(2000); }catch (InterruptedException e){ e.printStackTrace(); } synchronized (B){ System.out.println("1"
); } } } }); //建立一個執行緒t2 Thread t2 = new Thread(new Runnable() { @Override public void run() { synchronized (B){ synchronized (A){ System.out.println("2"); } } } }); //因為兩個執行緒是同時啟動的,但是執行緒1有睡眠的不釋放資源的操作。 //所以如果是執行緒1先執行,就會造成死鎖 //執行緒2中沒有睡眠,如果執行緒2先執行,就會執行緒2執行完及時釋放資源,執行緒1接著執行完畢,不會出現死鎖 t1.start(); t2.start();; } }

二、如何查看出現了死鎖

其實很簡單,你的程式卡住了。
但是並不直觀,直觀的是藉助工具,來監控程式

1、下面是我步驟一中的死鎖監控

這裡寫圖片描述

很明顯可以看出,爆紅了,我的僅有的兩個執行緒都出現了死鎖。
並且可以看到出現死鎖的執行緒情況。
互相不釋放資源。
這裡寫圖片描述

2、下面是我沒有死鎖的程式的健康程式

這裡寫圖片描述

很明顯沒有出現死鎖,程式是OK的。
這裡寫圖片描述

好啦,學習是一個過程,不斷的去進步!