操作系统锁的实现方法有哪几种_Java并发之Monitor实现
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实现相关推荐
- 操作系统锁的实现方法有哪几种_java 偏向锁、轻量级锁及重量级锁synchronized原理...
Java对象头与Monitor java对象头是实现synchronized的锁对象的基础,synchronized使用的锁对象是存储在Java对象头里的. 对象头包含两部分:Mark Word 和 ...
- 操作系统锁的实现方法有哪几种_「从入门到放弃-Java」并发编程-锁-synchronized...
简介 上篇[从入门到放弃-Java]并发编程-线程安全中,我们了解到,可以通过加锁机制来保护共享对象,来实现线程安全. synchronized是java提供的一种内置的锁机制.通过synchroni ...
- 操作系统锁的实现方法有哪几种_一文带你彻底了解同步和锁的本质
谈到锁,离不开多线程,或者进程间的通信.为了更好地从底层原理去了解锁的机制,形成体系化的知识,这篇文章我会从进程间通信底层原理说起,然后介绍一下Java中各种线程通信的实现机制,最后做一个系统的总结. ...
- python excel操作单元格_python 操作excel表格的方法
说明:由于公司oa暂缺,人事妹子在做考勤的时候,需要通过几个excel表格去交叉比对员工是否有旷工或迟到,工作量大而且容易出错. 这时候it屌丝的机会来啦,花了一天时间给妹子撸了一个自动化脚本. 1. ...
- mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享
Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...
- Oracle数据库的impdp导入操作以及dba_directories使用方法
Oracle数据库的impdp导入操作以及dba_directories使用方法 今天从同事那里拿到了导出的dmp文件,当导入时发现了很多问题,记下来以免以后忘记,以下是本人的操作过程: 1.首先是创 ...
- c# mysql executescalar_C# 操作MySQL数据库, ExecuteScalar()方法执行T-SQL语句, COUNT(*), 统计数据...
C# 操作My SQL数据库需要引用"MySql.Data", 可通过两种方式获取. 1.从NuGet下载"Install-Package MySql.Data -Ver ...
- 误操作数据库的一个方法
1 问题数据库 备份日志 backup log InterCreditAVDb to disk='E:\黑名单系统\数据库\log1.bak' 2 还原最新完整备份的数据 use master RES ...
- mac php 连接mysql数据库_Mac环境下php操作mysql数据库的方法分享_PHP教程
Mac环境下php操作mysql数据库的方法分享 今天在mac上搭建好了php的环境,我们就把php操作mysql数据库的方法分享给大家,有需要的小伙伴参考下. Mac本地环境搭建 在Mac系统,我们 ...
最新文章
- 查询ms sql 2005版本号
- 更精准地生成字幕!哥大Facebook开发AI新框架,多模态融合,性能更强
- SpringMVC拦截器2(资源和权限管理)(作为补充说明)
- 使用libsvm实现归一化
- Html中的各种高度宽度
- 如何在 GPU 上加速数据科学
- html 文件上传框 input标签
- c语言123报数,新人求解一道C语言题。。。麻烦了
- magento模板中XML与phtml关系
- 复购分析实践中,Pandas 遇到了大难题
- java 最少使用(lru)置换算法_[内附完整源码和文档] 基于C#的可视化虚拟存储器管理(LUR算法)...
- define语句换行\后不能有空格
- java生成流程图_java源代码转换为流程图
- 计算机毕业设计asp.net学院网站系统VS开发sqlserver数据库web结构c#编程计算机网页源码项目
- 【手持式微波频谱分析仪】真正便携且功能强大的仪器 - 欧洲制造
- led显示屏属于计算机类吗,计算机显示IPS和LED屏幕的优缺点是什么?
- Cesium中的地球坐标系转换:岁差章动计算(XYs)
- iPhone进入到了恢复模式怎么办?
- 2021最新PHP短网址生成系统/短链接生成系统/URL缩短器系统源码
- calcbusiness使用教程_Calc Business
热门文章
- [Python+debug] 设置Python环境变量-Windows10
- [Python] 堆叠函数 stack((a,b), axis=0)
- matlab2c使用c++实现matlab函数系列教程-var函数
- NSArray 的遍历
- mongodb update ()命令
- 现实JS模板,可设置默认值
- [转载] Python的变量与常量与基本命名规则
- [转载] Python time sleep()方法如何使用?
- [转载] 把数据对象转成字符串_python入门基础培训教程,Python 字符串学习
- [转载] 【Python】range()、np.arange()、np.linspace()、np.logspace()的使用和区别