从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?
来源:互联网 发布:网络诈骗需要什么证据 编辑:程序博客网 时间:2024/05/18 02:42
这一章节我们来讨论一下synchronized同步代码块在jvm层面的执行。
1.synchronized同步代码块是依赖字节码指令来控制
代码清单:
package com.ray.deepintothread.ch02.topic_26;/** * * @author RayLee * */public class SynchBlock {private Object object = new Object();public void test1() {synchronized (object) {}}public void test2() {}}
反编译指令:javap -c,这里需要注意的是必须加上-c不然很多信息都不会打印出来
C:\Users\Administrator>javap -c E:\workspace\DeepIntoThread\bin\com\ray\deepintothread\ch02\topic_26\SynchBlock.class
反编译结果:
Compiled from "SynchBlock.java"public class com.ray.deepintothread.ch02.topic_26.SynchBlock { public com.ray.deepintothread.ch02.topic_26.SynchBlock(); Code: 0: aload_0 1: invokespecial #10 // Method java/lang/Object."<init>":()V 4: aload_0 5: new #3 // class java/lang/Object 8: dup 9: invokespecial #10 // Method java/lang/Object."<init>":()V 12: putfield #12 // Field object:Ljava/lang/Object; 15: return public void test1(); Code: 0: aload_0 1: getfield #12 // Field object:Ljava/lang/Object; 4: dup 5: monitorenter 6: monitorexit 7: return public void test2(); Code: 0: return}
通过反编译结果我们可以看见,对比两个不同的方法,反编译出来的结果是明显不一样的,在同步代码块方法里面,它出现了monitorenter和monitorexit这两个字节码指令,同步代码块就是通过这两个命令来实现的,这两个命令向来都是配对出现的。
2.执行过程
当进入方法后,不一定马上进入同步状态,只有进入同步代码块的时候,才是真正的同步开始,
代码块持有对象锁->执行->执行完成->释放锁
如果代码块内部抛出异常,而代码块或者方法体没有相应的处理,则立刻释放锁。
3.其实在更深的层面,同步代码块跟同步方法的实现都是一样的,都是通过monitorenter和monitorexit这两个字节码指令来实现的,不过jvm隐藏了同步方法的字节码指令。
总结:这一章节我们讨论了synchronized同步代码块在jvm是怎样执行的?
这一章节就到这里,谢谢
------------------------------------------------------------------------------------
我的github:https://github.com/raylee2015/DeepIntoThread
目录:http://blog.csdn.net/raylee2007/article/details/51204573
0 0
- 从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?
- 从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
- 从头认识多线程-2.11 通过同步代码块证明synchronized标记的是对象锁
- 从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
- 从头认识多线程-2.9 缓解同步方法的隐患-同步代码块
- 从头认识多线程-2.10 同步代码块的特殊现象:一半同步,一半异步
- 从头认识多线程-2.18 同步方法与同步静态代码块持有的是不同的锁
- 从头认识多线程-2.13 synchronized ()代码块不单可以用this,也可以用其他对象
- 从头认识多线程-2.17 同步静态方法和静态代码块
- 从头认识多线程-2.15 解决由同步的synchronized (newobject()) 引起的脏读的方法
- 从头认识多线程-2.14 由同步的synchronized (newobject()) 引起的异步现象和脏读
- 从头认识多线程-2.20 synchronized同步方法的无限等待与解决方法
- Java---13---多线程---synchronized 同步代码块
- 【多线程】synchronized同步块
- JAVA之旅(十三)——线程的安全性,synchronized关键字,多线程同步代码块,同步函数,同步函数的锁是this
- 多线程 synchronized(this)与 synchronized(非this)同步代码块的区别
- java多线程-多线程的安全问题-多线程同步代码块-锁Synchronized
- 从头认识多线程-2.7 同步是不具备继承性的
- Android Volley完全解析(三),定制自己的Request
- linux基础(29)--救援模式挽救数据--RHEL6.5
- c++ template实例化
- jmeter的常用组件
- TestNG在java中执行命令行
- 从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?
- mongodb安装与启动
- Wildcard App IDs can not be used to create in House provisioning profiles.Please use an Explicit App
- Wget用法、参数解释的比较好的一个文章
- word设置的密码忘了怎么办?
- yyuc框架介绍
- WEBGIS系统部署流程
- Struts2重要知识点总结
- Spring通知类型