1. 死锁代码 DeadLockDemo
package study.lock;
import java.util.concurrent.TimeUnit;
public class DeadLockDemo {
public static void main(String[] args) {
String lockA = "lockA";
String lockB = "lockB";
new Thread(new HoldLockThread(lockA, lockB), "ThreadA").start();
new Thread(new HoldLockThread(lockB, lockA), "ThreadB").start();
try {TimeUnit.MINUTES.sleep(5);} catch (InterruptedException e) {e.printStackTrace();}
System.exit(0);
}
}
class HoldLockThread implements Runnable {
private String lockA;
private String lockB;
public HoldLockThread(String lockA, String lockB) {
this.lockA = lockA;
this.lockB = lockB;
}
@Override
public void run() {
synchronized (lockA) {
System.out.printf("%s 持有 %s,尝试获取 %s\n", Thread.currentThread().getName(), lockA, lockB);
try {TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}
synchronized (lockB) {
System.out.printf("%s 持有 %s,尝试获取 %s\n", Thread.currentThread().getName(), lockB, lockA);
}
}
}
}
2. 验证
1. idea 开发验证
在 idea 中运行上述代码,可得到如下运行提示:
打开 idea Terminal 终端,输入如下指令,查看当前 java 进程的堆栈信息:
# 查看运行 DeadLockDemo 的 java 进程的堆栈信息
jps | grep DeadLockDemo | awk '{print $1}' | xargs jstack
核心输出信息如下:
2. Centos7 Linux 服务端验证
以阿里云 Centos7 服务器为例,需要在服务器上装 jdk,我们安装 jdk8,使用如下命令查找合适的 jdk rpm:
# 1. 先验证服务器是否有安装 java
rpm -qa | grep -i jdk
# 2. 服务器没有安装 jdk 的前提下,查找合适的 1.8.0 jdk devel rpm
yum search jdk | grep -i devel | grep -i 1.8.0
搜索结果如下:
直接装 java-1.8.0-openjdk-devel.x86_64
即可,devel 版是带调试工具的,安装命令如下:
# 安装 jdk8
yum install -y java-1.8.0-openjdk-devel.x86_64
安装完毕后,将死锁代码 DeadLockDemo.java
复制到指定目录 /usr/local/jsj
并切换至该目录下:
-
编译
DeadLockDemo.java
,由于DeadLockDemo.java
是带package
信息的,使用如下命令编译javac -d . DeadLockDemo.java
编译完毕,示意图如下:
-
运行
DeadLockDemo
, 由于是死锁代码,为了方便在当前终端调试,使用如下指令运行进程:# 以后台方式运行 DeadLockDemo nohup java study.lock.DeadLockDemo &
运行示意图如下:
-
查看运行上述 Java 进程的堆栈信息,使用如下指令:
# 查看运行 DeadLockDemo 的 java 进程的堆栈信息 jps | grep DeadLockDemo | awk '{print $1}' | xargs jstack
核心输出信息如下: