前言
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() {@Overridepublic void run() {synchronized (A){// 让线程先睡眠2stry {Thread.sleep(1000);// 尝试获取B对象的锁synchronized (B){System.out.println("线程A获取到B对象");}}catch (Exception e){e.printStackTrace();}}}}).start();new Thread(new Runnable() {@Overridepublic void run() {// 占有B对象synchronized (B){// 尝试获取B对象的锁synchronized (A){System.out.println("线程B获取到A对象");}}}}).start();}
}
死锁的发生原因是两个线程互相尝试获取对方所持有的资源,但自身又不会提前释放锁,就造成两个线程互相等待释放资源,造成系统的阻塞。
我们可以通过jps查看进程号,再通过jstack命令来排查死锁。

jstack [pid]排查死锁

















