java-level deadlock
如下代码可以模拟java死锁。注意:当出现死锁时,应用程序是无响应的。错误信息:
Found one Java-level deadlock:
=============================
"Thread-1":
waiting to lock monitor 0x000000001c773158 (object 0x000000076bbc06b8, a java.util.concurrent.Concurren
tHashMap),
which is held by "Thread-0"
"Thread-0":
waiting to lock monitor 0x000000001c774548 (object 0x000000076bbc06f8, a java.lang.Object),
which is held by "Thread-1"
deadlock demo及deadlock信息
上代码:- import java.util.concurrent.ConcurrentHashMap;
- import static java.util.concurrent.TimeUnit.SECONDS;
- public class TestDeadlockMain {
- private static final ConcurrentHashMap<String, String> concurrentHashMap1 = new ConcurrentHashMap<>(128);
- private static final Object concurrentHashMap2 = new Object();
- public static void main(String[] args) {
- new Thread(() -> {
- synchronized (concurrentHashMap1) {
- // 模拟逻辑执行
- try {
- SECONDS.sleep(1L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- synchronized (concurrentHashMap2) {
- // 模拟逻辑执行
- System.out.println("test deadlock");
- }
- }
- }).start();
- new Thread(() -> {
- synchronized (concurrentHashMap2) {
- synchronized (concurrentHashMap1) {
- // 模拟逻辑执行
- try {
- SECONDS.sleep(1L);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }
- }).start();
- new Thread(()->{
- while (true){
- System.out.println(System.currentTimeMillis());
- try {
- SECONDS.sleep(1);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- }
- }).start();
- }
- }
复制代码
运行程序,通过控制台日志是无法看到死锁信息的。只能看到第三个线程在间隔1s不停的打日志,却无法看到另外两个线程在干啥。
如果是所调用的程序有用户界面的话,就会看到长时间无响应或超时的现象。
至于这个demo呢,我们可以借助IDEA的Terminal窗口。执行jps -l 命令,找到当前执行的java程序的进程pid。 接下来执行 jstack pid 命令,查看JVM里的线程快照信息。
如下贴出来Terminal窗口的内容:
jstack简介
- jstack命令用于打印指定Java进程、核心文件或远程调试服务器的Java线程的Java堆栈跟踪信息[1]。
- jstack命令可以生成JVM当前时刻的线程快照。线程快照是当前JVM内每一条线程正在执行的方法堆栈的集合,生成线程快照的主要目的是定位线程出现长时间停顿的原因,如线程间死锁、死循环、请求外部资源导致的长时间等待等。
- 如果java程序崩溃生成core文件,jstack工具可以用来获得core文件的java stack和native stack的信息,从而可以轻松地知道java程序是如何崩溃和在程序何处发生问题。
- 当指定的进程在64位Java虚拟机上运行时,可能需要指定-J-d64选项,例如:jstack -J-d64 -m pid。
- 该命令可能在未来的版本中不可用!!!
语法
jstack [ options ] pid
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |