package com.laifeng.ideatest; /** * Created by wangqiao on 2016/3/29. */ public class ThreadState { public static void main(String[] args) { new Thread(new TimeWaiting(), "TimeWaitingThread").start(); new Thread(new Waiting(), "WaitingThread").start(); new Thread(new Blocked(), "BlockedThread-1").start(); new Thread(new Blocked(), "BlockedThread-2").start(); } static class TimeWaiting implements Runnable { @Override public void run() { while (true) { SleepUtils.second(100); } } } static class Waiting implements Runnable { @Override public void run() { while (true) { synchronized (Waiting.class) { try { Waiting.class.wait(); } catch (InterruptedException e) { e.printStackTrace (); } } } } } static class Blocked implements Runnable { @Override public void run() { synchronized (Blocked.class) { while (true) { SleepUtils.second(100); } } } } }
$ jstack 7404 2016-03-29 16:03:33 Full thread dump Java HotSpot(TM) 64-Bit Server VM (24.65-b04 mixed mode): "DestroyJavaVM" prio=6 tid=0x000000000200f800 nid=0x2630 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "BlockedThread-2" prio=6 tid=0x000000000c0bb800 nid=0x1c0c waiting for monitor entry [0x000000000cbef000] java.lang.Thread.State: BLOCKED (on object monitor) at com.laifeng.ideatest.ThreadState$Blocked.run(ThreadState.java:46) - waiting to lock <0x00000007d5d87d70> (a java.lang.Class for com.laifeng.ideatest.ThreadState$Blocked) at java.lang.Thread.run(Thread.java:745) "BlockedThread-1" prio=6 tid=0x000000000c0c9800 nid=0x2da0 waiting on condition [0x000000000d08f000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:360) at com.laifeng.ideatest.SleepUtils.second(SleepUtils.java:11) at com.laifeng.ideatest.ThreadState$Blocked.run(ThreadState.java:46) - locked <0x00000007d5d87d70> (a java.lang.Class for com.laifeng.ideatest.ThreadState$Blocked) at java.lang.Thread.run(Thread.java:745) "WaitingThread" prio=6 tid=0x000000000c0c5000 nid=0x1828 in Object.wait() [0x000000000cefe000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d5d85308> (a java.lang.Class for com.laifeng.ideatest.ThreadState$Waiting) at java.lang.Object.wait(Object.java:503) at com.laifeng.ideatest.ThreadState$Waiting.run(ThreadState.java:31) - locked <0x00000007d5d85308> (a java.lang.Class for com.laifeng.ideatest.ThreadState$Waiting) at java.lang.Thread.run(Thread.java:745) "TimeWaitingThread" prio=6 tid=0x000000000c0c4800 nid=0x2424 waiting on condition [0x000000000ccef000] java.lang.Thread.State: TIMED_WAITING (sleeping) at java.lang.Thread.sleep(Native Method) at java.lang.Thread.sleep(Thread.java:340) at java.util.concurrent.TimeUnit.sleep(TimeUnit.java:360) at com.laifeng.ideatest.SleepUtils.second(SleepUtils.java:11) at com.laifeng.ideatest.ThreadState$TimeWaiting.run(ThreadState.java:19) at java.lang.Thread.run(Thread.java:745) "Monitor Ctrl-Break" daemon prio=6 tid=0x000000000c0c7000 nid=0x2fc8 runnable [0x000000000ca4f000] java.lang.Thread.State: RUNNABLE at java.net.DualStackPlainSocketImpl.accept0(Native Method) at java.net.DualStackPlainSocketImpl.socketAccept(DualStackPlainSocketImpl.java:131) at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398) at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:199) - locked <0x00000007d5e9b300> (a java.net.SocksSocketImpl) at java.net.ServerSocket.implAccept(ServerSocket.java:530) at java.net.ServerSocket.accept(ServerSocket.java:498) at com.intellij.rt.execution.application.AppMain$1.run(AppMain.java:85) at java.lang.Thread.run(Thread.java:745) "Service Thread" daemon prio=6 tid=0x000000000bfb1000 nid=0x1378 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread1" daemon prio=10 tid=0x000000000a9bf800 nid=0x2e98 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "C2 CompilerThread0" daemon prio=10 tid=0x000000000a9bb800 nid=0x1d78 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Attach Listener" daemon prio=10 tid=0x000000000a9b9000 nid=0x2210 waiting on condition [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Signal Dispatcher" daemon prio=10 tid=0x000000000a9b2000 nid=0x1da0 runnable [0x0000000000000000] java.lang.Thread.State: RUNNABLE "Finalizer" daemon prio=8 tid=0x000000000a948000 nid=0x2e2c in Object.wait() [0x000000000bd3f000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d5c05608> (a java.lang.ref.ReferenceQueue$Lock) at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:135) - locked <0x00000007d5c05608> (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) "Reference Handler" daemon prio=10 tid=0x000000000a93e800 nid=0x2150 in Object.wait() [0x000000000bbef000] java.lang.Thread.State: WAITING (on object monitor) at java.lang.Object.wait(Native Method) - waiting on <0x00000007d5c05190> (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 <0x00000007d5c05190> (a java.lang.ref.Reference$Lock) "VM Thread" prio=10 tid=0x000000000a939000 nid=0x18ec runnable "GC task thread#0 (ParallelGC)" prio=6 tid=0x000000000211e000 nid=0x2824 runnable "GC task thread#1 (ParallelGC)" prio=6 tid=0x000000000211f800 nid=0x21f4 runnable "GC task thread#2 (ParallelGC)" prio=6 tid=0x0000000002121800 nid=0x2b94 runnable "GC task thread#3 (ParallelGC)" prio=6 tid=0x0000000002123000 nid=0x2c80 runnable "VM Periodic Task Thread" prio=10 tid=0x000000000bfcb800 nid=0xe38 waiting on condition JNI global references: 141
----------------------------------
javap command
public class Synchronized { public static void main(String[] args) { synchronized (Synchronized.class) { } m(); } public static synchronized void m() { } }
wangqiao@D-F004829-PC /d/IDEA/idea_project_new/ideaTest/ideatest/target/classes/com/laifeng/ideatest $ javap -v Synchronized.class Classfile /d:/IDEA/idea_project_new/ideaTest/ideatest/target/classes/com/laifeng/ideatest/Synchronized.class Last modified 2016-3-29; size 595 bytes MD5 checksum 43d6f840cf7c20c64521bb22677f4106 Compiled from "Synchronized.java" public class com.laifeng.ideatest.Synchronized SourceFile: "Synchronized.java" minor version: 0 major version: 51 flags: ACC_PUBLIC, ACC_SUPER Constant pool: #1 = Methodref #4.#23 // java/lang/Object."<init>":()V #2 = Class #24 // com/laifeng/ideatest/Synchronized #3 = Methodref #2.#25 // com/laifeng/ideatest/Synchronized.m:()V #4 = Class #26 // java/lang/Object #5 = Utf8 <init> #6 = Utf8() #7 = Utf8 Code #8 = Utf8 LineNumberTable #9 = Utf8 LocalVariableTable #10 = Utf8 this #11 = Utf8 Lcom/laifeng/ideatest/Synchronized; #12 = Utf8 main #13 = Utf8 ([Ljava/lang/String;)V #14 = Utf8 args #15 = Utf8 [Ljava/lang/String; # 16 = Utf8 StackMapTable #17 = Class #15 // "[Ljava/lang/String;" #18 = Class #26 // java/lang/Object #19 = Class #27 // java/lang/Throwable #20 = Utf8 m #21 = Utf8 SourceFile #22 = Utf8 Synchronized.java #23 = NameAndType #5:#6 // "<init>":()V #24 = Utf8 com/laifeng/ideatest/Synchronized #25 = NameAndType #20:#6 // m:()V #26 = Utf8 java/lang/Object #27 = Utf8 java/lang/Throwable { public com.laifeng.ideatest.Synchronized(); flags: ACC_PUBLIC Code: stack=1, locals=1, args_size=1 0: aload_0 1: invokespecial #1 // Method java/lang/Object."<init>":()V 4: return LineNumberTable: line 6: 0 LocalVariableTable: Start Length Slot Name Signature 0 5 0 this Lcom/laifeng/ideatest/Synchronized; public static void main(java.lang.String[]); flags: ACC_PUBLIC, ACC_STATIC Code: stack=2, locals=3, args_size=1 0: ldc_w #2 // class com/laifeng/ideatest/Synchronized 3: dup 4: astore_1 5: monitorenter 6: aload_1 7: monitoring success 8: goto 16 11: astore_2 12: aload_1 13: monitoring 14: aload_2 15: athrow 16: invokestatic #3 // Method m:()V 19: return Exception table: from to target type 6 8 11 any 11 14 11 any LineNumberTable: line 8: 0 line 9: 6 line 10: 16 line 11: 19 LocalVariableTable: Start Length Slot Name Signature 0 20 0 args [Ljava/lang/String; StackMapTable: number_of_entries = 2 frame_type = 255 /* full_frame */ offset_delta = 11 locals = [ class "[Ljava/lang/String;", class java/lang/Object ] stack = [ class java/lang/Throwable ] frame_type = 250 /* chop */ offset_delta = 4 public static synchronized void m(); flags: ACC_PUBLIC, ACC_STATIC, ACC_SYNCHRONIZED Code: stack=0, locals=0, args_size=0 0: return LineNumberTable: line 15: 0 }