经过javap -c xxx.ClassName.class 查看java字节码内容html
同步代码块:monitorenter指令插入到同步代码块的开始位置,monitorexit指令插入到同步代码块的结束位置,JVM须要保证每个monitorenter都有一个monitorexit与之相对应。任何对象都有一个monitor与之相关联,当且一个monitor被持有以后,他将处于锁定状态。线程执行到monitorenter指令时,将会尝试获取对象所对应的monitor全部权,即尝试获取对象的锁;java
同步方法:synchronized方法则会被翻译成普通的方法调用和返回指令如:invokevirtual、areturn指令,在VM字节码层面并无任何特别的指令来实现被synchronized修饰的方法,而是在Class文件的方法表中将该方法的access_flags字段中的synchronized标志位置1,表示该方法是同步方法并使用调用该方法的对象或该方法所属的Class在JVM的内部对象表示Klass作为锁对象。iphone
Java对象头和monitor是实现synchronized的基础线程
https://m.study.163.com/article/1048043425?utm_campaign=share&utm_medium=iphoneShare&utm_source=weixin&utm_u=1033560747翻译
http://www.cnblogs.com/javaminer/p/3889023.htmlhtm