前言
java中锁是个非常有用的工具,运用的场景非常多,因为它使用起来非常简单而且容易理解。但是如果对锁的使用不当就有可能造成死锁,一旦产生死锁就可能会造成系统不可用。下面使用一段代码来模拟死锁发生的场景。
public class DeadLock {
private static String A ="a";
private static String B ="b";
public static void main(String[] args) {
new DeadLock().deadLockT();
}
/**
* 模拟死锁
*/
private void deadLockT() {
new Thread(new Runnable() {
@Override
public void run() {
synchronized (A){
// 让线程先睡眠2s
try {
Thread.sleep(1000);
// 尝试获取B对象的锁
synchronized (B){
System.out.println("线程A获取到B对象");
}
}catch (Exception e){
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// 占有B对象
synchronized (B){
// 尝试获取B对象的锁
synchronized (A){
System.out.println("线程B获取到A对象");
}
}
}
}).start();
}
}
死锁的发生原因是两个线程互相尝试获取对方所持有的资源,但自身又不会提前释放锁,就造成两个线程互相等待释放资源,造成系统的阻塞。
我们可以通过jps查看进程号,再通过jstack命令来排查死锁。
jstack [pid]排查死锁