Synchronized详解

2023-11-12

目录

一、如何解决线程并发安全问题

二、synchronized原理详解

1、加锁的方式

2、synchronized底层原理

3、Monitor监视器锁

①:MonitorEnter指令获取monitor所有权过程

②:MonitorExit指令


一、如何解决线程并发安全问题

实际上,所有的并发模式在解决线程安全问题时,采用的方案都是序列化访问临界资源。即在同一时刻,只有一个线程访问临界资源,也称同步互斥访问。Java中提供了两种synchronized和Lock,同步器的本质就是加锁。

注:当多线程执行一个方法时,该方法内部的局部变量并不是临界资源,它们在每个线程的私有栈中,因此不具有共享性,不会导致线程安全问题。

二、synchronized原理详解

1、加锁的方式

synchronizd内置锁是一种对象锁,作用粒度是对象,可以用来实现对临界资源的同步互斥访问,是可冲入的。加锁的方式有三种:

①:同步实例方法,锁是当前实例对象;

②:同步类方法,锁是当前类对象;

③:同步代码块,锁是括号里面的对象。

2、synchronized底层原理

synchronized是基于JVM内置锁实现的,通过内部对象monitor(监视器锁)实现,基于进入与退出monitor对象实现方法和代码块同步。监视器锁的实现依赖底层操作系统的Mutex lock(互斥锁)实现,它是一个重量级锁性能较低。在1.5之后的版本经过优化,内置锁的并发性能已经基本与lock持平。

每个同步对象都有自己的Monitor(监视器锁),加锁过程如下图所示

3、Monitor监视器锁

任何一个对象都有y一个Monitor与之关联,当一个Monitor被持有后,它将处于锁定状态。synchronized在JVM里实现的都是基于进入和退出Monitor对象来实现方法同步和代码块同步,也就是可以通过对MonitorEnter和MonitorExit指令来实现。

①:MonitorEnter指令获取monitor所有权过程

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

b:如果线程已经占有该monitor,只是重新进入,则进入monitor的进入数加1;

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

②:MonitorExit指令

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

b:monitorexit指令出现了两次,第一次为同步正常退出释放锁,第二次为发送异步退出释放锁。

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

Synchronized详解 的相关文章

随机推荐

  • 小学生学Arduino---------点阵(二)动态图片以及文字

    今天进阶了利用人眼视觉暂留原理制作动态的图片变换 1 熟练掌握图片显示器的使用 2 创作多种动态图片 文字的显示 3 明确动态图片 文字显示过程 4 掌握图片显示器中清空指令的使用 5 搭建动态图片 文字的显示电路 6 编写动态图片 文字的
  • QGIS获取OSM地图矢量数据

    目录 一 QGIS加载OSM底图图层 二 quickosm插件导入openstreetmap数据 三 数据导出 四 Overpass query查询用法 五 写在最后 一 QGIS加载OSM底图图层 1 安装QuickMapServices
  • Android studio生成jks文件/Warning: JKS 密钥库使用专用格式。建议使用 “keytool -importkeystore -srckeystore

    这里写自定义目录标题 Android studio生成jks文件 开始 Android studio生成jks文件 Key was created with errors Warning JKS 密钥库使用专用格式 建议使用 keytool
  • 使用dcmtk获取dicom影像的像素值

    include widget h include ui widget h include dcmtk config osconfig h make sure OS specific configuration is included fir
  • 服务器iscsi如何修复,服务器重启后,iSCSI目标卡住了重新连接

    编辑 Ok so event 113 is KB972107 which is a fairly generic class of problems but the network stack is not fully prepared c
  • 【Docker 1(1),献给真心想学Java的打工人

    2 docker原理 3 docker为何比VM快 Docker有着比虚拟机更少的抽象层 docker利用的是宿主机的内核 VM需要的是Guest OS 四 Docker镜像常用命令 1 基本命令 docker version docker
  • 华为OD机试真题-最多等和不相交连续子序列【2023.Q1】

    题目描述 给定一个数组 我们称其中连续的元素为连续子序列 称这些元素的和为连续子序列的和 数组中可能存在几组连续子序列 组内的连续子序列互不相交且有相同的和 求一组连续子序列 组内子序列的数目最多 输出这个数目 输入描述 第一行输入为数组长
  • html5渐变色毛玻璃,基于CSS3实现的毛玻璃渐变效果

    毛玻璃说白了就是磨砂玻璃 隔着表面粗糙的磨砂玻璃观赏窗外的风景 总会带着点朦胧美 给人以若隐若现的感觉 远近之间的层次感也因此而被体现出来 这种效果不仅美观 而且可以通过清晰和模糊的对比来突出重点内容 因此被广泛应用于web设计领域 本教程
  • ajax arcengine,ArcGIS客户端开发学习笔记(一)—AJAX机制

    摘要 AJAX即 Asynchronous JavaScript and XML 异步JavaScript和XML 现在的GIS客户端编程都是基于Ajax技术的 我觉得Ajax最大的特点在于它提供了更好的用户体验 以往的Web开发 当用户填
  • 区块链技术5--BTC网络

    1BTC网络的工作过程 用户将交易发布到BTC网络上 节点收到交易后打包到区块 然后将区块发布到BTC网络上 2BTC网络的工作原理 比特币工作于网络应用层 其底层 网络层 是一个P2P Overlay network P2P覆盖网络 比特
  • Tableau Prep 数据处理工具使用入门

    1 什么是Tableau Prep 2018 04 Tableau 推出全新的数据准备产品 Tableau Prep 主要用户定位于如何帮助人们以快速可靠的方式对数据进行合并 组织和清理 进一步缩短从数据获取见解所需的时间 简而言之 Pre
  • kafka的安装搭建

    Kafka就不介绍了 主要记录下安装的过程 1 安装kafka得先安装jdk 可以使用以下命令查看下是否有安装过jdk rpm qa grep jdk 没有则运行一下命令安装jdk yum install java 1 8 0 openjd
  • 树莓派4B安装Pytorch, torchvision(附已编译安装包)

    树莓派4B安装Pytorch torchvision Install Pytorch Raspberry Pi 4B Linux raspberrypi 4 19 75 v7l 1270 SMP Tue Sep 24 18 51 41 BS
  • springboot集成swagger3+swagger-bootstrap-ui及使用详解

    1 引入 maven 依赖
  • Gradle中如何修改Springboot引入的依赖版本

    扫描漏洞升级 不知道各位是否遇到过以下问题 当下层项目将spring引入的某个依赖版本升级之后 上层项目只要指定了Springboot版本 那么还是会将这个版本改回去 比如 现在有两个Springboot项目A B B项目会调用A项目中的某
  • 玩一玩微信公众号开发(二) 管理凭据和自定义菜单

    管理access token access token介绍 在前面我们成功的使用了Spring Boot Web程序和微信对接 但是这仅仅是一个开始 我们还需要获取access token 也就是凭据 才能进行之后的工作 微信开发文档有如下
  • 大数据时代——生活、工作与思维的重大变革

    最近读了维克托 迈尔 舍恩伯格的 大数据时代 觉得有不少收获 让我这个大数据的小白第一次理解了大数据 作者是大数据的元老级先驱 放一张帅照 膜拜下 不过这本书我本人不推荐从头读一遍 因为书中的核心理念并不是特别多 可以看看我这篇博客 1 海
  • idea中git的简单使用及git分支

    这篇文章简单介绍了git 着重介绍了分支概念和idea中git的简单使用 提问题 git是啥 git的分支概念 idea中git的使用 git仓库 git命令 git安装 参考文章 git是个啥 分布式版本管理工具 git的前生今世 git
  • Solidity:源文件结构

    Solidity 源文件结构 SPDX License Identifier 如果源代码可用 则可以更好地建立对智能合约的信任 由于提供源代码总是涉及版权方面的法律问题 Solidity编译器鼓励使用机器可读的SPDX License Id
  • Synchronized详解

    目录 一 如何解决线程并发安全问题 二 synchronized原理详解 1 加锁的方式 2 synchronized底层原理 3 Monitor监视器锁 MonitorEnter指令获取monitor所有权过程 MonitorExit指令