从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
来源:互联网 发布:js 实现图片生成 编辑:程序博客网 时间:2024/06/07 13:31
这一章节我们来讨论一下synchronized同步方法在jvm层面的执行。
1.synchronized同步方法是不依赖字节码指令来控制
代码清单:
package com.ray.deepintothread.ch02.topic_25;/** * * @author RayLee * */public class SynchMethod {public synchronized void test1() {}public void test2() {}}
反编译指令:javap -c,这里需要注意的是必须加上-c不然很多信息都不会打印出来
C:\Users\Administrator>javap -c E:\workspace\DeepIntoThread\bin\com\ray\deepintothread\ch02\topic_25\SynchMethod.class
Compiled from "SynchMethod.java"public class com.ray.deepintothread.ch02.topic_25.SynchMethod { public com.ray.deepintothread.ch02.topic_25.SynchMethod(); Code: 0: aload_0 1: invokespecial #8 // Method java/lang/Object."<init>":()V 4: return public synchronized void test1(); Code: 0: return public void test2(); Code: 0: return}
通过反编译结果我们可以看见,对比两个不同的方法,反编译出来的结果是一样的,没有指令在里面,因为同步方法是不依赖字节码指令来实现
2.synchronized同步方法是通过标记方法常量池里面的方法表结构体(method_info structure)的assess_flags=ACC_SYNCHRONIZED来控制
就是说,当每一个方法编译时,都已经标记了相应的方法信息
method_info structure:(由于每一个变量里面的值很多,就不一一展示,如果读者想了解,可以参考java虚拟机规范4.6章节)
method_info {u2 access_flags;u2 name_index;u2 descriptor_index;u2 attributes_count;attribute_info attributes[attributes_count];}
方法持有对象锁->执行->执行完成->释放锁
如果方法内部抛出异常,而方法体没有相应的处理,则立刻释放锁。
3.方法级的同步是隐式的
根据上面反编译的结果,由于没有明显的字节码指令,因此方法级的同步时隐式的。
总结:这一章节我们讨论了synchronized同步方法在jvm是怎样执行的。
这一章节就到这里,谢谢
------------------------------------------------------------------------------------
我的github:https://github.com/raylee2015/DeepIntoThread
目录:http://blog.csdn.net/raylee2007/article/details/51204573
0 0
- 从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
- 从头认识多线程-2.26 synchronized同步代码块在jvm是怎样执行的?
- 从头认识多线程-2.11 通过同步代码块证明synchronized标记的是对象锁
- 从头认识多线程-2.15 解决由同步的synchronized (newobject()) 引起的脏读的方法
- 从头认识多线程-2.20 synchronized同步方法的无限等待与解决方法
- 从头认识多线程-2.8 同步方法的隐患
- 从头认识多线程-2.14 由同步的synchronized (newobject()) 引起的异步现象和脏读
- 从头认识多线程-2.12 synchronized标记的方法和synchronized(this)标记的代码块锁定的是当前对象
- 从头认识多线程-2.9 缓解同步方法的隐患-同步代码块
- 从头认识多线程-2.18 同步方法与同步静态代码块持有的是不同的锁
- 从头认识多线程-2.7 同步是不具备继承性的
- 从头认识java-18.6 synchronized在其他对象上同步和ThreadLocal来消除共享对象的同步问题
- 从头认识java-16.6 ByteBuffer是怎样存储的?
- 从头认识多线程-2.24 修改监视器对同步的影响
- 【多线程】synchronized同步方法
- 从头认识多线程-2.19 synchronized (new object())同步时各种不同类别的监视器以及其引起的问题(常量池的影响)
- 从头认识多线程-2.2 synchronized持有对象锁与类锁的相同点
- 从头认识多线程-2.3 synchronized持有对象锁与类锁的不同点
- ImageLoader配置
- Hive性能优化
- 强大的vim配置文件
- 官网下载CentOS
- [Android基础系列]设计模式(二)
- 从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?
- gerrit 在win7下安装总结
- Android中突发情况数据的保存和恢复
- Android ViewPager指示器 IndicatorBar
- WaitForMultipleObjects
- linux下的二进制文件查看器
- CentOS系统下docker的安装配置及使用详解
- 实用知识:SQL 约束(主键、外键)
- 机箱内的设备