使用什么原语来实现同步关键字?

2023-11-21

当我们使用synchronizedjava中的关键字,究竟使用哪个同步原语?Lock, Semaphore, Monitor, Mutex ?

EDIT :JVM如何在本机级别实现锁?


在字节码级别,java有monitorenter and monitorexit操作,记录在Java 虚拟机规范的本页,下面粘贴了片段(对象引用是操作的操作数,取自堆栈):

监控输入器 snippet

每个对象都有一个与其关联的监视器。执行的线程监控输入器获得与关联的监视器的所有权对象引用。如果另一个线程已经拥有与之关联的监视器对象引用,当前线程等待,直到该对象被 解锁,然后再次尝试获得所有权。如果当前线程 已经拥有关联的监视器对象引用,它增加一个 监视器中的计数器指示该线程的次数 进入监视器。如果监视器关联对象引用不是 被任何线程拥有,当前线程成为该线程的所有者 监视器,将此监视器的条目计数设置为 1。

监控退出 snippet

当前线程应该是与其关联的监视器的所有者 引用的实例对象引用。线程递减 计数器指示其进入此监视器的次数。如果 结果计数器的值变为零,当前线程 释放监视器。如果监视器关联对象引用变为空闲,其他正在等待获取该监视器的线程 被允许尝试这样做。

因此,“监视器”就是答案,无论是这个还是 NPE 答案中引用的 JLS 都没有指定在本机代码级别发生的情况。如果您有特定的平台(CPU 和操作系统)和特定的 JVM 实现(包括版本),您当然可以查看 JVM 源代码(如果它是开源 JVM),或者在这里询问。

我也遇到过这个博客是1997年的,其中有更多详细信息。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用什么原语来实现同步关键字? 的相关文章

随机推荐

  • MAC地址打印

    这是获取一些有关网络信息的代码 问题是当它打印 MAC 地址时 它会正常打印 有时与fff的 喜欢 00 21 84 a2 12 88 和 00 ffffff21 84 a2 12 ffffff88 因机器而异 这是代码 include
  • HttpWebRequest.EndGetResponse 在 Windows Phone 7 中引发 NotSupportedException

    在 Silverlight Windows Phone 7 项目中 我正在创建一个 HttpWebRequest 获取 RequestStream 向流中写入一些内容并尝试获取响应 但我总是收到 NotSupportedException
  • CGPathAddCurveToPoint 的参数是什么意思?

    我想建立一个CGPathRef以编程方式基于一天中不同时间点的太阳坐标 计算点数不是问题 但我想做一个CGPathRef那是顺利而有思想的CGPathAddCurveToPoint会是合适的 我了解路径 变换 x 和 y 参数 但我不确定其
  • python中按键减少

    我正在尝试思考在 python 中执行此操作的最有效方法 假设我有一个元组列表 dog 12 2 cat 15 1 dog 11 1 cat 15 2 dog 10 3 cat 16 3 假设我有一个函数 它接受其中两个元组并将它们组合起来
  • 为什么 DateTime.ToShortTimeString() 不尊重“区域和语言设置”中的短时间格式?

    我遇到了一个问题 可能是由于我对 DateTime ToShortTimeString 方法的工作原理的误解 当使用此函数格式化时间字符串时 我假设它会遵循 Windows 7 格式设置中的 短时间 设置 Control Panel gt
  • 在 Python 中以二进制格式写入和读取日期时间

    我想在 Python 中将日期时间列表存储在二进制文件中 编辑 二进制 是指每种数据类型的最佳数字表示 其用途是保存由 unix timestamp 纬度 经度 海拔 组成的GPS轨迹点 因此整个结构是little endian Long
  • 函数调用与局部变量

    我经常看到多次调用其他函数的函数 而不是存储一次函数的结果 i e 1 void ExampleFunction if TestFunction gt x TestFunction lt y TestFunction z a TestFun
  • 使用 R Shiny 框架的密码字段

    我打算为我的应用程序登录 为此我需要一个密码字段 我不知道闪亮是否用于此目的 但仍然可能吗 code for a simple text box is textInput id label value 但是有可能有密码字段吗 另外 与此同时
  • WPF 样式按钮 MouseOver 问题

    我正在尝试在按钮上制作一个简单的鼠标悬停效果 当鼠标悬停时它确实会改变颜色 但颜色会立即更改为默认按钮背景 我如何覆盖此行为 这是我的代码 Style myBtnStyle new Style Trigger bla new Trigger
  • Azure 导出 SQL 数据库示例

    鉴于 Microsoft 不推荐使用以前的导出 SQL DB 的方法 他们提出了一个建议的示例here subscriptionId YOUR AZURE SUBSCRIPTION ID Login AzureRmAccount Set A
  • 如何对 CursorLoader 结果进行排序?

    我使用 CursorLoader 查询结果 这不是我想要在 ListFramgenet 中显示的顺序 怎么排序呢 我用它来设置适配器 mAdapter new SimpleCursorAdapter getActivity android
  • 动态添加按钮到对话框

    有没有办法动态添加按钮到 jquery ui 中的对话框 我尝试使用 this add button 有时您也想稍后添加按钮 var mydialog result of jqueryui dialog var buttons mydial
  • 图像边框半径在 css 转换期间不起作用

    我在用着border radius 50 使图像变圆 默认情况下 图像会被模糊和缩放 带有隐藏的溢出 悬停时它将消除模糊和缩放 但是 当我在元素上使用 CSS 过渡时 它会在过渡期间暂时显示溢出 http jsfiddle net jonn
  • WatchOS 2:“无法安装手表应用程序”“启动‘TestApp WatchKit 应用程序扩展’时出错”

    每次我尝试在 Xcode 7 beta 4 中安装 watchOS 2 应用程序时 我都会在 iOS 上收到 AlertView 弹出错误 无法安装手表应用 TestApp 已安装在您的 iPhone 上 但 Apple Watch 的 T
  • 如何将 php 放入 JavaScript 中?

    我已经尝试过 但它不起作用 这里是tutorial我为此目的使用过 尝试这个
  • 使用 php 创建 api

    我想使用php开发一个简单的api 我的功能是 如果有人输入一些所需的值 那么他们将从我网站旁边的算法中获得计算结果 我不知道从哪里开始 并且也没有获得任何使用 PHP 的 API 示例代码 听起来您想创建一个其他人可以连接 发送答案和检索
  • 用于触摸手势的优秀 JavaScript 库或 jQuery 插件是什么? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 我不需要像 Sencha
  • 让 ng-repeat 在 AngularJS 的 $interpolate 服务中工作

    我正在使用 Bootstrap 的 AngularJs UI 组件 我想将填写好的模板插入到弹出窗口功能的数据元素之一中 这适用于查找不在 ng repeat 内部的所有元素 如何让 ng repeat 元素在插值模板中工作 我有一个笨蛋h
  • 使用 pdfbox 编辑 pdf 页面

    我如何通过在我已经知道的像素特定位置书写来使用java和pdfbox编辑pdf页面 我尝试过这个 但它会覆盖 PDDocument document null try document PDDocument load new File x
  • 使用什么原语来实现同步关键字?

    当我们使用synchronizedjava中的关键字 究竟使用哪个同步原语 Lock Semaphore Monitor Mutex EDIT JVM如何在本机级别实现锁 在字节码级别 java有monitorenter and monit