java线程状态——死锁
来源:互联网 发布:淘宝发快递一般多少钱 编辑:程序博客网 时间:2024/06/03 21:44
参考:
java 线程状态
java 线程状态——情况续说
java线程状态——java线程状态图
死锁,概念有很多,可以google
现在列出死锁的模拟代码和jstack的输出
一方面是理解死锁,一方面是学习jstack找出死锁,进行代码调优
import java.util.concurrent.TimeUnit;public class e{ static class DeadT implements Runnable { private Object lock1; private Object lock2; private String name; private String lockname1; private String lockname2; public DeadT(Object lock1,Object lock2,String name,String lockname1,String lockname2) { this.lock1 = lock1; this.lock2 = lock2; this.name = name; this.lockname1 = lockname1; this.lockname2 = lockname2; } public void run() { System.out.println(name+" acquiring lock"+lockname1+"... "); synchronized(lock1) { System.out.println(name + " acquired lock"+lockname1+"... "); work(); System.out.println(name + " acquiring lock"+lockname2+"... "); synchronized(lock2) { System.out.println(name + " acquired lock"+lockname2+"... "); } } }//end run public void work() { try { TimeUnit.SECONDS.sleep(8); } catch(Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { Object lock1 = new Object(); Object lock2 = new Object(); Thread t1 = new Thread(new DeadT(lock1,lock2,"t1","1","2")); Thread t2 = new Thread(new DeadT(lock2,lock1,"t2","2","1")); t1.setName("t1"); t2.setName("t2"); t1.start(); try { TimeUnit.SECONDS.sleep(2); } catch(Exception e) { e.printStackTrace(); } t2.start(); try { TimeUnit.SECONDS.sleep(2); } catch(Exception e) { e.printStackTrace(); } System.out.println("main finished!"); }
jstack输出如下:
2017-02-14 14:13:20Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.80-b11 mixed mode): java.lang.Thread.State: RUNNABLE"DestroyJavaVM" prio=10 tid=0x00007f8c68008800 nid=0x37a4 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE"t2" prio=10 tid=0x00007f8c680bb000 nid=0x37b6 waiting for monitor entry [0x00007f8c55cd4000] java.lang.Thread.State: BLOCKED (on object monitor) at e$DeadT.run(e.java:33) - waiting to lock <0x00000007d704aa10> (a java.lang.Object) - locked <0x00000007d704aa20> (a java.lang.Object) at java.lang.Thread.run(Thread.java:745)"t1" prio=10 tid=0x00007f8c680b9000 nid=0x37b5 waiting for monitor entry [0x00007f8c55dd5000] java.lang.Thread.State: BLOCKED (on object monitor) at e$DeadT.run(e.java:33) - waiting to lock <0x00000007d704aa20> (a java.lang.Object) - locked <0x00000007d704aa10> (a java.lang.Object) at java.lang.Thread.run(Thread.java:745) java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: RUNNABLE java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x00000007d7004858> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:151) at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:209) java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d7004470> (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 <0x00000007d7004470> (a java.lang.ref.Reference$Lock)"GC task thread#0 (ParallelGC)" prio=10 tid=0x00007f8c6801e000 nid=0x37a5 runnable"GC task thread#1 (ParallelGC)" prio=10 tid=0x00007f8c68020000 nid=0x37a6 runnable"GC task thread#2 (ParallelGC)" prio=10 tid=0x00007f8c68022000 nid=0x37a7 runnable"GC task thread#3 (ParallelGC)" prio=10 tid=0x00007f8c68023800 nid=0x37a8 runnable"GC task thread#4 (ParallelGC)" prio=10 tid=0x00007f8c68025800 nid=0x37a9 runnable"GC task thread#5 (ParallelGC)" prio=10 tid=0x00007f8c68027800 nid=0x37aa runnable"GC task thread#6 (ParallelGC)" prio=10 tid=0x00007f8c68029000 nid=0x37ab runnable"GC task thread#7 (ParallelGC)" prio=10 tid=0x00007f8c6802b000 nid=0x37ac runnable"VM Periodic Task Thread" prio=10 tid=0x00007f8c680aa000 nid=0x37b4 waiting on conditionJNI global references: 107Found one Java-level deadlock:============================="t2": waiting to lock monitor 0x00007f8c1c006218 (object 0x00000007d704aa10, a java.lang.Object), which is held by "t1""t1": waiting to lock monitor 0x00007f8c1c003988 (object 0x00000007d704aa20, a java.lang.Object), which is held by "t2"Java stack information for the threads listed above:==================================================="t2": at e$DeadT.run(e.java:33) - waiting to lock <0x00000007d704aa10> (a java.lang.Object) - locked <0x00000007d704aa20> (a java.lang.Object) at java.lang.Thread.run(Thread.java:745)"t1": at e$DeadT.run(e.java:33) - waiting to lock <0x00000007d704aa20> (a java.lang.Object) - locked <0x00000007d704aa10> (a java.lang.Object) at java.lang.Thread.run(Thread.java:745)Found 1 deadlock.
从jstack输出中可以很明显找到deadlock的字眼,并在最后说出了死锁的条件,请仔细看jstack输出以及代码。
0 0
- java线程状态——死锁
- java线程——死锁
- java线程——死锁
- Java——线程死锁
- [线程]——死锁
- 学习笔记——JAVA线程<5>线程的死锁
- JAVA 线程死锁,以及linux 命令和jstack 命令 查看线程死锁状态信息
- JAVA 线程死锁,以及linux 命令和jstack 命令 查看线程死锁状态信息
- Java笔记(4)-线程、Thread、Runable、开子线程、线程运行状态、线程同步、线程死锁
- Java线程和多线程(九)——死锁
- java再复习——线程的死锁问题
- Java线程安全问题——同步和死锁
- 多线程——线程死锁
- 线程(四)—死锁
- java线程状态——java线程状态图
- java线程死锁例子
- java模拟线程死锁
- java线程 死锁实例
- java后台解析json字符串
- 2D 横幅过关游戏 Frogatto
- ls和rm管道符删除文件
- Netty源码解读------------客户端接入绑定(二)
- Could not Open Install.Log File解决方法
- java线程状态——死锁
- C#中调用CMD命令行截取输出流的范例
- LeetCode-19. Remove Nth Node From End of List
- Android之源码之模块编译调试
- WebView交互传递json字符串并解析
- servlet的一个小项目(四)
- 继续自己的第一个swift项目的奋斗之路!
- TFS 测试用例导入、导出工具
- Hibernate入门