jstack命令案例分析:对wait的线程没有调用notify()导致程序无法停止
对wait的线程没有调用notify()导致的结果就是程序无法停止。
o.notify(); //必须,否则无法停止程序
public class T06_00_sync_wait_notify {public static void main(String[] args) {final Object o = new Object();char[] aI = "1234567".toCharArray();char[] aC = "ABCDEFG".toCharArray();new Thread(()->{synchronized (o) {for(char c : aI) {System.out.print(c);try {o.notify();o.wait(); //让出锁} catch (InterruptedException e) {e.printStackTrace();}}// o.notify(); //必须,否则无法停止程序}}, "t1").start();new Thread(()->{synchronized (o) {for(char c : aC) {System.out.print(c);try {o.notify();o.wait();} catch (InterruptedException e) {e.printStackTrace();}}o.notify();}}, "t2").start();}
}
使用jstack进行分析:
2020-04-30 21:12:49
Full thread dump OpenJDK 64-Bit Server VM (11.0.5+10-post-Ubuntu-0ubuntu1.118.04 mixed mode, sharing):Threads class SMR info:
_java_thread_list=0x00007f724c001ea0, length=11, elements={0x00007f72900a3800, 0x00007f72900a5800, 0x00007f72900ab000, 0x00007f72900ad000,
0x00007f72900af000, 0x00007f72900b1000, 0x00007f72900e8800, 0x00007f72900ed800,
0x00007f72900f9800, 0x00007f7290014800, 0x00007f724c001000
}"Reference Handler" #2 daemon prio=10 os_prio=0 cpu=0.15ms elapsed=70.83s tid=0x00007f72900a3800 nid=0x8ea waiting on condition [0x00007f72783b3000]java.lang.Thread.State: RUNNABLEat java.lang.ref.Reference.waitForReferencePendingList(java.base@11.0.5/Native Method)at java.lang.ref.Reference.processPendingReferences(java.base@11.0.5/Reference.java:241)at java.lang.ref.Reference$ReferenceHandler.run(java.base@11.0.5/Reference.java:213)"Finalizer" #3 daemon prio=8 os_prio=0 cpu=0.31ms elapsed=70.83s tid=0x00007f72900a5800 nid=0x8eb in Object.wait() [0x00007f72782b2000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.5/Native Method)- waiting on <0x00000000d43024f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000d43024f8> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:176)at java.lang.ref.Finalizer$FinalizerThread.run(java.base@11.0.5/Finalizer.java:170)"Signal Dispatcher" #4 daemon prio=9 os_prio=0 cpu=0.43ms elapsed=70.82s tid=0x00007f72900ab000 nid=0x8ec runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"C2 CompilerThread0" #5 daemon prio=9 os_prio=0 cpu=10.71ms elapsed=70.82s tid=0x00007f72900ad000 nid=0x8ed waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLENo compile task"C1 CompilerThread0" #6 daemon prio=9 os_prio=0 cpu=24.92ms elapsed=70.82s tid=0x00007f72900af000 nid=0x8ee waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLENo compile task"Sweeper thread" #7 daemon prio=9 os_prio=0 cpu=0.53ms elapsed=70.81s tid=0x00007f72900b1000 nid=0x8ef runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Service Thread" #8 daemon prio=9 os_prio=0 cpu=0.08ms elapsed=70.77s tid=0x00007f72900e8800 nid=0x8f0 runnable [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Common-Cleaner" #9 daemon prio=8 os_prio=0 cpu=0.27ms elapsed=70.76s tid=0x00007f72900ed800 nid=0x8f2 in Object.wait() [0x00007f7268e64000]java.lang.Thread.State: TIMED_WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.5/Native Method)- waiting on <0x00000000d439b4c0> (a java.lang.ref.ReferenceQueue$Lock)at java.lang.ref.ReferenceQueue.remove(java.base@11.0.5/ReferenceQueue.java:155)- waiting to re-lock in wait() <0x00000000d439b4c0> (a java.lang.ref.ReferenceQueue$Lock)at jdk.internal.ref.CleanerImpl.run(java.base@11.0.5/CleanerImpl.java:148)at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)at jdk.internal.misc.InnocuousThread.run(java.base@11.0.5/InnocuousThread.java:134)"t2" #11 prio=5 os_prio=0 cpu=0.38ms elapsed=70.75s tid=0x00007f72900f9800 nid=0x8f4 in Object.wait() [0x00007f7268c62000]java.lang.Thread.State: WAITING (on object monitor)at java.lang.Object.wait(java.base@11.0.5/Native Method)- waiting on <0x00000000d439d560> (a java.lang.Object)at java.lang.Object.wait(java.base@11.0.5/Object.java:328)at T06_00_sync_wait_notify.lambda$main$1(T06_00_sync_wait_notify.java:31)- waiting to re-lock in wait() <0x00000000d439d560> (a java.lang.Object)at T06_00_sync_wait_notify$$Lambda$2/0x0000000840060c40.run(Unknown Source)at java.lang.Thread.run(java.base@11.0.5/Thread.java:834)"DestroyJavaVM" #12 prio=5 os_prio=0 cpu=69.22ms elapsed=70.75s tid=0x00007f7290014800 nid=0x8e3 waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"Attach Listener" #13 daemon prio=9 os_prio=0 cpu=0.73ms elapsed=44.86s tid=0x00007f724c001000 nid=0x92f waiting on condition [0x0000000000000000]java.lang.Thread.State: RUNNABLE"VM Thread" os_prio=0 cpu=3.33ms elapsed=70.84s tid=0x00007f72900a1000 nid=0x8e9 runnable "GC Thread#0" os_prio=0 cpu=0.39ms elapsed=70.86s tid=0x00007f729002d000 nid=0x8e4 runnable "G1 Main Marker" os_prio=0 cpu=0.38ms elapsed=70.85s tid=0x00007f7290043000 nid=0x8e5 runnable "G1 Conc#0" os_prio=0 cpu=0.04ms elapsed=70.85s tid=0x00007f7290044800 nid=0x8e6 runnable "G1 Refine#0" os_prio=0 cpu=0.38ms elapsed=70.85s tid=0x00007f7290074800 nid=0x8e7 runnable "G1 Young RemSet Sampling" os_prio=0 cpu=10.06ms elapsed=70.85s tid=0x00007f7290076000 nid=0x8e8 runnable
"VM Periodic Task Thread" os_prio=0 cpu=48.15ms elapsed=70.77s tid=0x00007f72900eb000 nid=0x8f1 waiting on condition JNI global refs: 4, weak refs: 0
jstack命令案例分析:对wait的线程没有调用notify()导致程序无法停止相关推荐
- GIt思维导图命令+案例分析
文章目录 0.思维导图and速查命令图表 1.配置user信息 2.创建第一个仓库并配置local用户信息 3.往仓库中提交文件commit 4.给文件重命名的简便方法 5.通过git log 查看版 ...
- mysql先删后增并发时出现死锁_MySQL死锁案例分析一(先delete,再insert,导致死锁)...
一.死锁案例 MySQL版本:Percona MySQL Server 5.7.19 隔离级别:可重复读(RR) 业务逻辑:并发下按某个索引字段先delete记录,再insert记录 比如:begin ...
- Java命令学习系列—Jstack命令(转载)
jstack是java虚拟机自带的一种堆栈跟踪工具 1. 功能 jstack用于生成java虚拟机当前时刻的线程快照.线程快照是当前java虚拟机内每一条线程正在执行的方法堆栈的集合,生成线程快照的主 ...
- 使用jstack命令dump线程信息
jstack是java虚拟机自带的一种堆栈跟踪工具,jstack用于打印出给定的java进程ID或远程调试服务的java堆栈信息. 线程状态 想要通过jstack命令来分析线程的情况的话,首先要知道线 ...
- jstack命令 详解
1.介绍 jstack用于打印出给定的java进程ID或core file或远程调试服务的Java堆栈信息,如果是在64位机器上,需要指定选项"-J-d64",Windows的js ...
- jstack命令详解(linux jstack命令详解)
几种常见的操作tomcat的linux命令 重启tomcat ps x 查看pid kill -9 pid 杀死进程 /app/tomcat/bin/startup.sh 启动tomcat 追踪日志 ...
- jstack命令的使用
文章来源:https://blog.csdn.net/wufaliang003/article/details/80414267 jstack是java虚拟机自带的一种堆栈跟踪工具. jstack用于 ...
- jstack命令应用
0 概述 jstack 命令用于生成虚拟机当前时刻线程快照(一般称为threaddump 或者javacore 文件).线程快照就是当前虚拟机内每一条线程正在执行的方法堆栈集合,生成线程快照的目的主要 ...
- jstack定位CPU占用率高的线程代码
目录 一.背景 二.jstack定位实战演示 三.关于线程的状态 四.最后 一.背景 性能测试过程中,如果我们发现应用服务器CPU使用率高(超过70%),接口TPS低的现象,此时常见的情况是由以下的原 ...
最新文章
- do{}while(0) 作用
- OO实现ALV TABLE 九:ALV的事件
- gitlab 更新文件_GitLab任意文件读取漏洞公告
- mysql安装及一些注意点
- linux虚拟文件系统(四)-文件系统挂载操作分析
- Hive和HBase的区别
- IOS第五天(2:用户登录,回车的监听(代理模式UITextFieldDelegate)) 和关闭键盘
- Android系统进程间通信(IPC)机制Binder中的Client获得Server远程接口过程源代码分析(3)...
- HTML5重要知识点整理
- 《Java大学教程》—第23章 Java网络编程
- python threading join_浅谈Python中threading join和setDaemon用法及区别说明
- 山东大学高频电子线路实验五 混频器实验详解
- 谷歌生物医学专用翻译_干货| 三款精选文献翻译神器,助力文献阅读!
- Web版RSS阅读器(一)——dom4j读取xml(opml)文件
- ftps软件android,透视相机软件ftp
- NC7WZ14P6X绝对最大额定参数
- java datasource使用_DataSource 使用方法
- 志强系列的服务器能吃鸡吗,性能芯变化!三款至强E5 V3服务器体验
- 一款APP从设计稿到切图过程全方位揭秘
- c语言rgb数值颜色渐变算法,颜色渐变算法
热门文章
- 【时间序列】NeuralProphet:Prophet的Pytorch实现!精度更高 预测更快 特性更多!...
- 【Python基础】在pandas中利用hdf5高效存储数据
- 用户偏好类结构化数据分析题参赛总结
- 数据科学真的是一份有前途的工作吗?
- 网易云信亮相WOT, 打造“IM+连麦互动直播”云服务
- 在创业公司,不懂运维的程序员如何兼顾公司的运维工作
- SpringMVC重定向传参
- 关于vue-cli创建项目(小白)(2)mock数据
- redis-rdb-tools来解析分析reids dump文件及内存使用量
- System.InvalidOperationException:“线程间操作无效: 从不是创建控件“txtPortName02”的线程访问它。”...