简述synchronized的实现原理

synchronized是Java中用于实现线程同步的关键字,其实现原理基于JVM的内部机制。当一个线程试图访问一个synchronized代码块时,它必须先获取一个锁。这个锁与对象关联,通常是通过对象的监视器(Monitor)来实现的。每个Java对象都有一个与之关联的Monitor,这个Monitor充当了一种互斥锁的角色。

当一个线程想要访问某个对象的synchronized代码块时,它首先需要获取该对象的Monitor。如果该Monitor已经被其他线程持有,则当前线程将会被阻塞,直至Monitor变为可用状态。当线程完成synchronized块的代码执行后,它会释放Monitor,并把Monitor返还给对象池,这样其他线程才能获取Monitor并进入synchronized代码块。

此外,Synchronized的实现也涉及到JVM的内存交互操作,包括lock(锁定)和unlock(解锁)指令。当一个线程试图获取某个对象的Monitor锁时,它会执行lock指令来尝试获取该锁。如果这个锁已经被其他线程占有,那么当前线程将会被阻塞,直至锁变得可用。当一个线程持有了Monitor锁并且已完成对临界区资源的操作后,它将会执行unlock指令来释放该锁,从而使得其他线程有机会获取该锁并执行相应的临界区代码。

总结来说,synchronized的实现原理主要依赖于JVM的内部机制,通过对象监视器(Monitor)和内存交互操作来实现线程之间的同步和互斥访问。收到新的锁请求时首先自旋,如果通过自旋也没有获取锁资源,被放入ContentionList(该做法对于已经进入队列的线程是不公平的,体现了synchronized的不公平性)。为了防止ContentionList尾部的元素被大量线程进行CAS访问影响性能,Owner线程会在是释放锁时将ContentionList的部分线程移动到EntryList并指定某个线程(一般是最先进入的)为OnDeck线程。Owner并没有将锁直接传递给OnDeck线程而是把锁竞争的权利交给他,该行为叫做竞争切换,牺牲了公平性但提高了性能。获取到锁的OnDeck线程会变为Owner线程,未获取到的仍停留在EntryList中。Owner线程在被wait阻塞后会进入WaitSet,直
到某个时刻被唤醒再次进入EntryList。ContentionList、EntryList、WaitSet中的线程均为阻塞状态。当Owner线程执行完毕后会释放锁资源并变为!Owner状态。
 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/608248.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

react输入框检索树形(tree)结构

input搜索框搜索树形子级内容1. input框输入搜索内容2. 获取tree结构数据3. 与tree匹配输入的内容,tree是多维数组,一级一级的对比输入的内容是否匹配,用forEach循环遍历数据,匹配不到在往下找,直到找到为null &#x…

MIT_线性代数笔记:第 25 讲 对称矩阵和正定性

目录 对称矩阵 Symmetric matrices实特征值 Real eigenvalues正定矩阵 Positive definite matrices 对称矩阵是最重要的矩阵之一,其特征值为实数并且拥有一套正交特征向量。正定矩阵的性质则更好。 对称矩阵 Symmetric matrices 包含特殊性质的矩阵,例如…

Probabilistic Forecasting with Temporal Convolutional Neural Network

Abstract 我们提出了一种基于卷积神经网络(CNN)的概率预测框架,用于多个相关时间序列预测。该框架可用于估计参数和非参数设置下的概率密度。更具体地说,构建基于扩张因果卷积网络的堆叠残差块来捕获序列的时间依赖性。与表示学习…

Certum与Geotrust的SSL证书区别

Certum和GeoTrust都是知名的CA认证机构,这两个品牌下的SSL证书在多个方面存在一些差异。今天就随SSL盾小编了解Certum与Geotrust证书的区别。 一、Certum机构背景 Certum是波兰的一家CA认证机构,成立于2002年,至今已有近20多年的历史。旗下有…

LeetCode-棒球比赛(682)

题目描述: 你现在是一场采用特殊赛制棒球比赛的记录员。这场比赛由若干回合组成,过去几回合的得分可能会影响以后几回合的得分。 比赛开始时,记录是空白的。你会得到一个记录操作的字符串列表 ops,其中 ops[i] 是你需要记录的第…

基于ZU19EG的100G-UDP解决方案

概述 本文档介绍ZU19EG与Mellanox CX6 100G网卡通信解决方案。 环境配置 FPGA硬件:519-ZU19EG的4路100G光纤PCIe加上计算卡 电脑:国产国鑫主板(双PCU):Gooxi G2DA-B CPU:Intel Xeon Silver 2.2GHz 内存&#xff1…

Asp .Net Web应用程序(.Net Framework4.8)网站发布到IIS

开启IIS 如果已开启跳过这步 打开控制面板-程序 打开IIS 发布Web程序(.Net Framework 4.8 web网页) 进入IIS管理器新建一个应用池 新建一个网站 网站创建完毕 为文件夹添加访问权限 如果不添加访问权限,运行时将会得到如下错误 设置权限 勾…

kubernetes ResourceQuotas Limits(资源配额)

开头语 写在前面:如有问题,以你为准, 目前24年应届生,各位大佬轻喷,部分资料与图片来自网络 内容较长,页面右上角目录方便跳转 简介 当多个用户或团队共享具有固定节点数目的集群时,人们会…

如何测试Web网页的兼容性测试?

测试Web网页的兼容性是一个重要的步骤,以确保网站在不同的浏览器、操作系统和设备上都能正常工作。以下是一些步骤和方法来测试网页的兼容性: 01. 确定目标平台 首先,确定要测试的目标浏览器、操作系统和设备。这通常包括最常用的浏览器&…

bbox_to_anchor调整图例位置

ax.legend([box[boxes][0], box[boxes][1], box[boxes][2], box[boxes][3]],[1961-1990, 1971-2000, 1981-2010, 1991-2020], bbox_to_anchor(0.05, 1), locupper left, ncol2)

使用串口 DMA 模式接收不定长数据

一、简介 曾经遇到客户有一个需求,需要用串口 DMA 的方式接收不定长度的数据,DMA 有个缺点就是在每次传输前需要设定好传输的字节长度,这种方式显然对于接收不定长度的数据来说没有那么灵活。但 DMA 也有着显著的优点,如可直接访…

阿里巴巴中国站 1688 商品详情 API 实时数据获取

一、引言 随着电子商务的快速发展,实时数据获取在商业决策中扮演着越来越重要的角色。阿里巴巴中国站作为国内领先的 B2B 平台,提供了丰富的 API 接口供开发者使用。本文将重点介绍如何通过阿里巴巴中国站的 1688 商品详情 API 实现实时数据获取&#x…

JS新手入门笔记整理:对象

对象可以分为两种:一种是“自定义对象”,另外一种是“内置对象”。自定义对象,指的是需要我们自己定义的对象。内置对象,指的是不需要我们自己定义的(即系统已经定义好的)、可以直接使用的对象。在JavaScri…

abp vnext 下载指定版本的项目

开发环境 Win11 vs2022 abp vnext 下载地址:Get Started | ABP.IO 下载abp框架之前,需要先安装CLI,打开命令提示符,执行以下命令即可,这个也可以指定版本下载,这里就不做介绍了,以及删除命令…

网络协议到底是什么?

本文介绍了通信协议的概念以及如何通过添加特定的机制和信息来确保无错误的数据传输。 1. 通信协议的概念 协议由所有 "交换 "信息的站点使用的通信规则和程序组成。所有在网络上交换数据的站点都使用协议,以满足目标。 协议是一组预定义的规则和约定&am…

【MySQL】数据库之Redis的持久化

目录 一、Redis的高可用 1.1什么是高可用 1.2Redis的高可用技术 1.3持久化功能 1.4Redis持久化的方式 二、Redis的持久化之RDB 2.1RDB持久化的触发方式 触发条件 RDB持久化的触发分为手动触发和自动触发两种。 (1)手动触发 (2&…

‘pip‘ 不是内部或外部命令、ImportError: cannot import name ‘SCHEME_KEYS‘

错误一:启动程序中出现致命错误:无法使用“f:\pythonv\scripts\python.exe” G:\pythonv\scripts\ pip.exe” 错误二:‘pip‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。 错误三:ImportError: cannot import name SCH…

九、分布式锁 —— 超详细操作演示!!!

九、分布式锁 —— 超详细操作演示! 九、分布式锁9.1 分布式锁的工作原理9.2 问题引入9.2.1 场景9.2.2 实现9.2.3 分析 9.3 setnx 实现方式9.3.1 原理9.3.2 实现9.3.3 问题 9.4 为锁添加过期时间9.4.1 原理9.4.2 实现9.4.3 问题 9.5 为锁添加标识9.5.1 原理9.5.2 实…

C语言习题集(036)

//写一函数&#xff0c;求一个字符串的长度。在main函数 //中输入字符串&#xff0c;并输出其长度。 /* */ //解答&#xff1a; #include<stdio.h> int length(char *s) { int i; for(i0;i<10000;i) { if(s[i]\0)break; }return i; } int main() { char *s; pr…

嵌入式-C语言-江科大-指针的详解与应用

文章目录 一&#xff1a;计算机存储机制二&#xff1a;定义指针三&#xff1a;指针的操作四&#xff1a;数组与指针五&#xff1a;指针的应用道友&#xff1a;最清晰的脚印&#xff0c;踩在最泥泞的道路上。 推荐视频配合我的笔记使用 [C语言] 指针的详解与应用-理论结合实践&a…