当前位置:云骑士 > 使用教程 > 电脑资讯 > synchronize底层原理

synchronize底层原理

  • 文案作者: 圣殿骑士
  • 时间:2019-07-26 15:02:01
  • 播放量:

synchronize底层原理是什么?我们先通过反编译下面的代码来看看Synchronized是如何实现对代码块进行同步的:

1 package com.paddx.test.concurrent;

2

3 public class SynchronizedDemo {

4 public void method() {

5 synchronized (this) {

6 System.out.println("Method 1 start");

7 }

8 }

9 }

反编译结果:

synchronize底层原理

关于这两条指令的作用,我们直接参考JVM规范中描述:

monitorenter :

Each object is associated with a monitor. A monitor is locked if and only if it has an owner. The thread that executes monitorenter attempts to gain ownership of the monitor associated with objectref, as follows:

• If the entry count of the monitor associated with objectref is zero, the thread enters the monitor and sets its entry count to one. The thread is then the owner of the monitor.

• If the thread already owns the monitor associated with objectref, it reenters the monitor, incrementing its entry count.

• If another thread already owns the monitor associated with objectref, the thread blocks until the monitor's entry count is zero, then tries again to gain ownership.

这段话的大概意思为:

每个对象有一个监视器锁(monitor)。当monitor被占用时就会处于锁定状态,线程执行monitorenter指令时尝试获取monitor的所有权,过程:

1、如果monitor的进入数为0,则该线程进入monitor,然后将进入数设置为1,该线程即为monitor的所有者。

2、如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1.

3.如果其他线程已经占用了monitor,则该线程进入阻塞状态,直到monitor的进入数为0,再重新尝试获取monitor的所有权。

monitorexit:

The thread that executes monitorexit must be the owner of the monitor associated with the instance referenced by objectref.

The thread decrements the entry count of the monitor associated with objectref. If as a result the value of the entry count is zero, the thread exits the monitor and is no longer its owner. Other threads that are blocking to enter the monitor are allowed to attempt to do so.

这段话的大概意思为:

执行monitorexit的线程必须是objectref所对应的monitor的所有者。

指令执行时,monitor的进入数减1,如果减1后进入数为0,那线程退出monitor,不再是这个monitor的所有者。其他被这个monitor阻塞的线程可以尝试去获取这个 monitor 的所有权。

通过这两段描述,我们应该能很清楚的看出Synchronized的实现原理,Synchronized的语义底层是通过一个monitor的对象来完成,其实wait/notify等方法也依赖于monitor对象,这就是为什么只有在同步的块或者方法中才能调用wait/notify等方法,否则会抛出java.lang.IllegalMonitorStateException的异常的原因。

我们再来看一下同步方法的反编译结果:

源代码:

1 package com.paddx.test.concurrent;

2

3 public class SynchronizedMethod {

4 public synchronized void method() {

5 System.out.println("Hello World!");

6 }

7 }

反编译结果:

synchronize底层原理(1)

从反编译的结果来看,方法的同步并没有通过指令monitorenter和monitorexit来完成(理论上其实也可以通过这两条指令来实现),不过相对于普通方法,其常量池中多了ACC_SYNCHRONIZED标示符。JVM就是根据该标示符来实现方法的同步的:当方法调用时,调用指令将会检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置,如果设置了,执行线程将先获取monitor,获取成功之后才能执行方法体,方法执行完后再释放monitor。在方法执行期间,其他任何线程都无法再获得同一个monitor对象。 其实本质上没有区别,只是方法的同步是一种隐式的方式来实现,无需通过字节码来完成。

相关教程
三星笔记本亮度调节方法

三星笔记本亮度调节方法

笔记本电脑和台式机电脑的系统中,旧的系统是是可以直接查看的并且有调节亮度的地方。现在是新的操作系统亮度一般是在所有驱动的控制面板里设置调...
浏览:2332020-07-24
电信副卡怎么取消

电信副卡怎么取消

可以带上自己的身份证到电信营业厅取消电信副卡,注意不能跨省办理;如没空去营业厅,就打客服电话10000,按0转人工服务,告诉客服人员自己的需求即...
浏览:6792020-06-05
苹果为卖iPhone不遗余力:苹果中国官网上线“这很iPhone”教程

苹果为卖iPhone不遗余力:苹果中国官网上线“这很iPhone”教程

3月8日消息iPhone依然是无可争议的旗舰手机,但它的地位已不如之前那么不可动摇,这从苹果官方以及国内电商平台一系列的降价促销就能看出来。 但iPh...
浏览:2772019-03-08
最新版360极速浏览器,壁纸存在哪个文件夹

最新版360极速浏览器,壁纸存在哪个文件夹

点击+新建一个新标签页,找到鼠标图标,点击它,找到自己喜欢的那张壁纸,点击设为壁纸,点击软件快捷打开方式,点击右键里的打开文件位置,点击鼠...
浏览:7322019-09-03
金山词霸离线如何安装离线词典

金山词霸离线如何安装离线词典

在使用金山词霸时也会遇到没有网络的情况,那要怎么下载金山词霸离线词典呢?一起来看看具体下载教程吧。...
浏览:3112020-02-12
怎么样注销支付宝

怎么样注销支付宝

进入支付宝主界面后,点击下端的“我的”进入,点击我的进入后,点击右上角的设置进入,进入设置界面后,点击安全中心进入,进入安全中心后。...
浏览:45402019-09-03
coreldraw怎么画圆角矩形

coreldraw怎么画圆角矩形

首先选择矩形工具,在页面上画出一个矩形,然后在菜单栏里设置圆角弧度,可以对矩形的四个角分别进行设置。...
浏览:2822019-12-13
如何把喜马拉雅连接到天猫精灵上

如何把喜马拉雅连接到天猫精灵上

点击天猫精灵图标打开软件,点击个人头像,进入个人设置界面,点击三方账号管理绑定,点击喜马拉雅的未绑定,界面跳转后,勾选账号绑定协议,点击...
浏览:3992020-07-16
玩lol电脑重启的解决方案

玩lol电脑重启的解决方案

将LOL称为如今最流行的网游也不为过,有些网友有时候在登陆LOL的时候,电脑自动重启了,这给游戏玩家造成的影响是巨大的。那么玩lol电脑重启有什么解...
浏览:1462017-02-17
苹果7p可以双卡双待吗01:12

苹果7p可以双卡双待吗

答:苹果系列都只能安装一张手机卡。如果有需要你可以买一个便携式苹果双卡双待的东西,可以放另外一张卡,用蓝牙连接就可以了。...
浏览:35252019-09-21
最新视频

换一批

推荐视频

换一批

最新推荐   视频 文章 软件 应用

Copyright 2013-2020 云骑士(www.yunqishi.net) 版权所有 All Rights Reserved  粤ICP备15086669号