Java并发之Monitor实现

可能在synchronized关键字的实现原理中,你已经知道了它的底层是使用Monitor的相关指令来实现的,但是还不清楚Monitor的具体细节。本文将让你彻底Monitor的底层实现原理

01简介

本文主要翻译Monitors – The Basic Idea of Java Synchronization国外大神的文章,刚兴趣的同学可以阅读一下原文。当你在学校学习操作系统课程的,你可能记得管程在操作系统中是一个同步概念。当然,管程也被用在Java同步中。本文将会使用分析陈述管程基本思想。

02什么是管程

一个管程可以被认为是一个带有特殊房间的建筑,这个特殊房间只能被一个线程占用。这个房间包含很多数据和代码。

如果一个线程要占用特殊房间(也就是红色区域),那么首先它必须在Hallway中等待。调度器基于某些规则(例如先进先出)从Hallway中取一个线程。如果线程在Hallway由于某些原因被挂起,它将会被送往等待房间(也就是蓝色区域),在一段时间后被调度到特殊房间中。

简而言之,监视器是一种监视现场访问特殊房间的设备。他能够使有且仅有一个线程访问的受保护的代码和数据。

03监视器如何在Java中实现

在Java虚拟机中,每一个对象和类都与一个监视器相关联。为了实现监视器的互斥功能,锁(有时候也称为互斥体)与每一个对象和类关联。在操作系统书中,这叫做信号量,互斥锁也被称为二元信号量。

如果一个线程拥有某些数据上的锁,其他线程想要获得锁只能等到这个线程释放锁。如果我们在进行多线程编程时总是需要编写一个信号量,那就不太方便了。幸运的是,我们不需要这样做,因为JVM会自动为我们做这件事。

为了声明一个同步区域(这里意味着数据不可能被超过一个线程访问),Java提供了synchronized块和synchronized方法。一旦代码被synchronized关键字绑定,它就是一个监视器区域。它的锁将会在后面被JVM实现。

06在Java同步代码中,那部分是同步监视器

我们知道每一个对象或者是类都和监视器关联,我认为一个很好的说法是每一个对象有一个监视器,从每一个对象有自己的临界区并且能监控线程序列。

为了协作不同的线程,Java提供了wait()和notify()来挂起一个线程和唤醒另一个在对象上等待的线程。这里有三个版本:

wait(long timeout, int nanos)
wait(long timeout) notified by other threads or notified by timeout.
notify(all)

这些方法仅仅被调用在synchronized代码块和synchronized方法内。原因是,如果一个方法不需要互斥,那么就不需要在线程之间监视或协作,每个线程都可以自由地访问该方法。

▼往期精彩回顾▼Java并发之线程Java并发之volatile关键字Java并发之synchronized关键字

点击上方二维码,关注我们

15

好看你就点点我

操作系统锁的实现方法有哪几种_Java并发之Monitor实现相关推荐

  1. 操作系统锁的实现方法有哪几种_java 偏向锁、轻量级锁及重量级锁synchronized原理...

    Java对象头与Monitor java对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的. 对象头包含两部分:Mark Word 和 ...

  2. 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...

    简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...

  3. 操作系统锁的实现方法有哪几种_一文带你彻底了解同步和锁的本质

    谈到锁,离不开多线程,或者进程间的通信.为了更好地从底层原理去了解锁的机制,形成体系化的知识,这篇文章我会从进程间通信底层原理说起,然后介绍一下Java中各种线程通信的实现机制,最后做一个系统的总结. ...

  4. python excel操作单元格_python 操作excel表格的方法

    说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...

  5. mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享

    Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...

  6. Oracle数据库的impdp导入操作以及dba_directories使用方法

    Oracle数据库的impdp导入操作以及dba_directories使用方法 今天从同事那里拿到了导出的dmp文件,当导入时发现了很多问题,记下来以免以后忘记,以下是本人的操作过程: 1.首先是创 ...

  7. c# mysql executescalar_C# 操作MySQL数据库, ExecuteScalar()方法执行T-SQL语句, COUNT(*), 统计数据...

    C# 操作My SQL数据库需要引用"MySql.Data", 可通过两种方式获取. 1.从NuGet下载"Install-Package MySql.Data -Ver ...

  8. 误操作数据库的一个方法

    1 问题数据库 备份日志 backup log InterCreditAVDb to disk='E:\黑名单系统\数据库\log1.bak' 2 还原最新完整备份的数据 use master RES ...

  9. mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享_PHP教程

    Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...

最新文章

  1. 查询ms sql 2005版本号
  2. 更精准地生成字幕!哥大Facebook开发AI新框架,多模态融合,性能更强
  3. SpringMVC拦截器2(资源和权限管理)(作为补充说明)
  4. 使用libsvm实现归一化
  5. Html中的各种高度宽度
  6. 如何在 GPU 上加速数据科学
  7. html 文件上传框 input标签
  8. c语言123报数,新人求解一道C语言题。。。麻烦了
  9. magento模板中XML与phtml关系
  10. 复购分析实践中,Pandas 遇到了大难题
  11. java 最少使用(lru)置换算法_[内附完整源码和文档] 基于C#的可视化虚拟存储器管理(LUR算法)...
  12. define语句换行\后不能有空格
  13. java生成流程图_java源代码转换为流程图
  14. 计算机毕业设计asp.net学院网站系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
  15. 【手持式微波频谱分析仪】真正便携且功能强大的仪器 - 欧洲制造
  16. led显示屏属于计算机类吗,计算机显示IPS和LED屏幕的优缺点是什么?
  17. Cesium中的地球坐标系转换:岁差章动计算(XYs)
  18. iPhone进入到了恢复模式怎么办?
  19. 2021最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码
  20. calcbusiness使用教程_Calc Business

热门文章

  1. [Python+debug] 设置Python环境变量-Windows10
  2. [Python] 堆叠函数 stack((a,b), axis=0)
  3. matlab2c使用c++实现matlab函数系列教程-var函数
  4. NSArray 的遍历
  5. mongodb update ()命令
  6. 现实JS模板,可设置默认值
  7. [转载] Python的变量与常量与基本命名规则
  8. [转载] Python time sleep()方法如何使用?
  9. [转载] 把数据对象转成字符串_python入门基础培训教程,Python 字符串学习
  10. [转载] 【Python】range()、np.arange()、np.linspace()、np.logspace()的使用和区别