一郎科技|Jvm - jstack工具( 三 )
<0x0000000783e066e0> (a java.lang.ref.Reference$Lock)at java.lang.Object.wait(Object.java:503)at java.lang.ref.Reference$ReferenceHandler.run(Reference.java:133)- locked <0x0000000783e066e0> (a java.lang.ref.Reference$Lock)我们能看到:
线程的状态: WAITING 线程的调用栈线程的当前锁住的资源: <0x0000000783e066e0> 线程当前等待的资源:<0x0000000783e066e0>
为什么同时锁住的等待同一个资源:
线程的执行中 , 先获得了这个对象的 Monitor(对应于 locked <0x0000000783e066e0>) 。 当执行到 obj.wait(), 线程即放弃了 Monitor的所有权 , 进入 “wait set”队列(对应于 waiting on <0x0000000783e066e0> ) 。
3. 利用工具进行分析
我们也可以把线程的状态信息保存到本地文件 , 然后利用一些工具进行分析 , 比如
1)dump thread stack到本地文件 C:\Users\Laolang>jstack 21656 > d:\\thread_stack.txt
2)利用IBM的TMDA工具()进行分析
3)或者使用在线工具threaddump-analyzer()进行分析
死锁分析学会了怎么使用jstack命令之后 , 我们就可以看看 , 如何使用jstack分析死锁了 , 这也是我们一定要掌握的内容 。啥叫死锁? 所谓死锁: 是指两个或两个以上的进程在执行过程中 , 由于竞争资源或者由于彼此通信而造成的一种阻塞的现象 , 若无外力作用 , 它们都将无法推进下去 。 此时称系统处于死锁状态或系统产生了死锁 , 这些永远在互相等待的进程称为死锁进程 。说白了 , 我现在想吃鸡蛋灌饼 , 桌子上放着鸡蛋和饼 , 但是我和我的朋友同时分别拿起了鸡蛋和病 , 我手里拿着鸡蛋 , 但是我需要他手里的饼 。 他手里拿着饼 , 但是他想要我手里的鸡蛋 。 就这样 , 如果不能同时拿到鸡蛋和饼 , 那我们就不能继续做后面的工作(做鸡蛋灌饼) 。 所以 , 这就造成了死锁 。看一段死锁的程序:
package javaCommand;/** * @author hollis */public class JStackDemo {public static void main(String[] args) {Thread t1 = new Thread(new DeadLockclass(true));//建立一个线程Thread t2 = new Thread(new DeadLockclass(false));//建立另一个线程t1.start();//启动一个线程t2.start();//启动另一个线程}}class DeadLockclass implements Runnable {public boolean falg;// 控制线程DeadLockclass(boolean falg) {this.falg = falg;}public void run() {/*** 如果falg的值为true则调用t1线程*/if (falg) {while (true) {synchronized (Suo.o1) {System.out.println("o1 " + Thread.currentThread().getName());synchronized (Suo.o2) {System.out.println("o2 " + Thread.currentThread().getName());}}}}/*** 如果falg的值为false则调用t2线程*/else {while (true) {synchronized (Suo.o2) {System.out.println("o2 " + Thread.currentThread().getName());synchronized (Suo.o1) {System.out.println("o1 " + Thread.currentThread().getName());}}}}}}class Suo {static Object o1 = new Object();static Object o2 = new Object();}
当我启动该程序时 , 我们看一下控制台:
我们发现 , 程序只输出了两行内容 , 然后程序就不再打印其它的东西了 , 但是程序并没有停止 。 这样就产生了死锁 。当线程1使用synchronized锁住了o1的同时 , 线程2也是用synchronized锁住了o2 。 当两个线程都执行完第一个打印任务的时候 , 线程1想锁住o2 , 线程2想锁住o1 。 但是 , 线程1当前锁着o1 , 线程2锁着o2 。 所以两个线程都无法继续执行下去 , 就造成了死锁 。
- 所持股份|万兴科技:公司控股股东、实际控制人吴太兵质押150万股
- 发布公告|数量过半!博创科技:天通股份累计减持约150万股
- 英雄科技聊数码|蔡崇信有实力买下篮网,那身价3200亿的马云,能买下几支NBA球队
- 科技前沿阵地|涨疯了!海思安防芯片遭哄抬“围剿”
- 月影浓|吴亦凡机械造型走秀 垫肩披风搭银框眼镜科技感足
- 中国历史发展过程|中国历史发展过程.中国的科技史界过去半个多世纪
- 天津|桂发祥:不再持有昆汀科技股份
- 消费|减持!天通股份:减持博创科技约32万股
- 处罚|老周侃股:吉鑫科技大股东应补偿踩雷投资者
- 华中科技大学|杯具!超本科线95分,本科有路不走,却梦幻般碰瓷,撞开专科的门