锁
锁是一个非常有用的工具,运用的场景非常多,因为他使用起来非常的简单,而且易于理解。但是,锁的问题就是很可能会出现一个非常坏的事情,就是一旦造成死锁,就会导致线程得不到释放,一旦死锁的线程出现的太多,就会造成系统的不可用。
一、死锁的例子
学习掌握一个概念,最好的方法就是去写一个例子。
复制出去,即可立马验证了。
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的。
好啦,学习是一个过程,不断的去进步!