併發處理:鎖,寫一個死鎖的例項和執行緒監控
阿新 • • 發佈:2018-11-09
鎖
鎖是一個非常有用的工具,運用的場景非常多,因為他使用起來非常的簡單,而且易於理解。但是,鎖的問題就是很可能會出現一個非常壞的事情,就是一旦造成死鎖,就會導致執行緒得不到釋放,一旦死鎖的執行緒出現的太多,就會造成系統的不可用。
一、死鎖的例子
學習掌握一個概念,最好的方法就是去寫一個例子。
複製出去,即可立馬驗證了。
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的。
好啦,學習是一個過程,不斷的去進步!