Monitor
vm通过进入、退出Monitor(对象监视器),实现对方法、同步块同步,每一个对象都有且仅有一个 monitor。
1.进入区 Entry Set
表线程通过synchronized
要求获取对象锁-> 对象未被锁-> 进入入拥有者;否则则在进入区等待,一旦对象锁被其他线程释放,立即参与竞争。
2.拥有者 The Owner
表示某一线程成功竞争到对象锁
3.等待区 Wait Set
表示线程通过对象的wait方法,释放对象的锁,并在等待区等待被唤醒 notify()
“Entry Set” –线程– “Waiting for monitor entry”
“Wait Set” –线程– “in Object.wait()”
称被synchronized保护起来的代码段为临界区 – Entry Set
4.查看编译后源码
public static void main(String[] args) {
synchronized (Synchronize.class){
System.out.println("Synchronize");
}
}// javap -c Synchronize 查看编译后信息
public class com.crossoverjie.synchronize.Synchronize {
public com.crossoverjie.synchronize.Synchronize();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()V
4: return
public static void main(java.lang.String[]);
Code:
0: ldc #2 // class com/crossoverjie/synchronize/Synchronize
2: dup
3: astore_1
**4: monitorenter**
5: getstatic #3 // Field java/lang/System.out:Ljava/io/PrintStream;
8: ldc #4 // String Synchronize
10: invokevirtual #5 // Method java/io/PrintStream.println:(Ljava/lang/String;)V
13: aload_1
**14: monitorexit**
15: goto 23
18: astore_2
19: aload_1
20: monitorexit
21: aload_2
22: athrow
23: return
Exception table:
from to target type
5 15 18 any
18 21 18 any
}
参考:
文档信息
- 本文作者:jiushun.cheng
- 本文链接:https://minipa.github.io/2016/07/01/thread-monitor/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)