从头认识多线程-2.25 synchronized同步方法在jvm是怎样执行的?

这一章节我们来讨论一下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\deepinto
thread\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];
}


当标记了同步方法,也就是assess_flags=ACC_SYNCHRONIZED,

方法持有对象锁->执行->执行完成->释放锁

如果方法内部抛出异常,而方法体没有相应的处理,则立刻释放锁。


3.方法级的同步是隐式的

根据上面反编译的结果,由于没有明显的字节码指令,因此方法级的同步时隐式的。


总结:这一章节我们讨论了synchronized同步方法在jvm是怎样执行的。



这一章节就到这里,谢谢

------------------------------------------------------------------------------------

我的github:https://github.com/raylee2015/DeepIntoThread


目录:http://blog.csdn.net/raylee2007/article/details/51204573






  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值