「Java同步原理与底层实现解析」

  • 原理概要:

java虚拟机中的同步基于进入与结束Monitor对象实现,无论是显式同步(同步代码块进入在jvm是根据monitorenter标志、结束是monitorexit标志,那最后一个是monitorexit是异常结束时被执行的释放指令)、隐式同步(同步方法无需通过字节码控制,而是ACC_SYNCHRONIZED声明为同步方法在jvm内部包装一个监视器锁被调用)都是如此,

  • 底层原理:(可重入的实现)

每一个锁关联一个线程持有者和一个计数器、当计数器为0时表示该锁没有被任何线程持有,此时任何线程都可以获得该锁并调用,当有一个线程请求成功时,jvm会记录下持有锁的线程并将计数器设为1,此时其他线程请求该锁,则必须等待,当持有该锁的线程再次请求这个锁,重入后将计数器加1,当线程退出该锁,计数器就会递减,如果计数器为0时则释放锁

同步代码块字节码

3 monitorenter
//...........
71 monitorexit
//...........
78 monitorexit
//...........
82 return        

同步方法字节码

在这里插入图片描述

  • 应用范围
  1. 可以保证在同一时刻,只有一个线程在访问被锁修饰的代码,也可以保证线程的变化,被另一个线程看到(可见性)
  2. 是一个互斥(所以有阻塞)、重量级锁
  3. 可以阻止jvm的指令重排序
  4. 总之使用同步会系统的很大开销、甚至可能会死锁
  • 应用方式:
  1. 修饰代码块:作用的对象是整个代码块的对象 FQA:当有一个线程访问这个代码块时,其他线程试图访问会出现阻塞 – |
  2. 方法:作用的对象是调用这个方法的对象 FQA:多线程下阻塞和修饰代码块等价,都锁定整个方法的内容 – |
  3. 静态方法:作用的对象是这个类的所有对象 FQA:多个对象也是一把锁,所以线程同步
  4. 类:作用主的对象是这个类的所有对象 FQA:多个对象也是一把锁,所以线程同步
  • 锁的状态:

1.无锁、
2.偏向锁、
3.轻量锁、
4.重量锁,
随着锁的竞争、从偏向锁到轻量级、在到重量级。锁的的升级是单向,也就是只能从低到高升级不会出现锁的降级

  • synchronized 的用法

a. synchronized 修饰 static静态方法 —— 锁住的是class对象
b.synchronized 修饰 普通方法 —— 锁住的是实例对象 (this)
c.synchronized (obj) 修饰代码块 —— 锁住的是obj对象

锁的状态记录在jvm对象头中

synchronized:他是对于当前虚拟机而言,但是同一个应用部署到多台服务器,它的实例是运行在多个不同的jvm中的之间是相互独立的,所以在多台服务器之间加锁需要用到分布式锁分布式锁:(redis实现,并不是实际意义上的加锁,只是setx一个key,每次去获取这个key(获取锁),释放这个key(释放锁))在使用分布式锁是会出现,在释放锁的时候如果前面的业务出问题了,导致释放锁没有执行,所以要对之前的业务逻辑进行异常捕获,并且将释放锁放到finally中,但是还会出现锁超时问题,将释放锁放到finally中就一定会被执行?在java中Exception是可以捕获的,但是机房停电、kill -9等操作,导致整个逻辑还没执行到finally就会出现问题,所以这个时候可以在setx之后设置一个过期时间,即使kill -9等操作,也会在这个过期时间将锁释放,这样的话后期的线程还是可以获取到锁的,

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Codeforces Round 926(Div.2) A~F

A.Sasha and the Beautiful Array(递推) 题意: 萨沙决定送给女友一个数组 a 1 , a 2 , … , a n a_1,a_2,\ldots,a_n a1​,a2​,…,an​。他发现女友会将数组的美丽度评估为所有从 2 2 2到 n n n的整数 i i i的 ( a i − a i − 1 ) (a_i−…

探索虚拟世界的程序员之路

计算机专业必看的几部电影 计算机专业必看的几部电影,就像一场精彩的编程盛宴!《黑客帝国》让你穿越虚拟世界,感受高科技的魅力;《社交网络》揭示了互联网巨头的创业之路,《源代码》带你穿越时间解救世界,…

好书推荐丨《细说机器学习:从理论到实践》

文章目录 写在前面机器学习推荐图书内容简介编辑推荐作者简介 推荐理由粉丝福利写在最后 写在前面 本期博主给大家推荐一本有关机器学习的全新正版书籍,对机器学习、人工智能感兴趣的小伙伴们快来看看吧~ 机器学习 机器学习(Machine Learning, ML&…

Elasticsearch查询报错 Result window is too large

一现象: es数据分页查询前端提示系统异常,后端报错日志 二根本原因: 默认情况下,Elasticsearch 限制了 from size 参数的组合不能超过 10,000 条记录,用于防止查询大数据集时对系统资源的过度消耗 三解决办法&#…

MySQL 基础知识(十)之 MySQL 架构

目录 1 MySQL 架构说明 2 连接层 3 核心业务层 3.1 查询缓存 3.2 解析器 3.3 优化器 3.4 执行器 4 存储引擎层 5 参考文档 1 MySQL 架构说明 下图是 MySQL 5.7 及其之前版本的逻辑架构示意图 MySQL 架构大致可分为以下三层: 连接层:负责跟客户…

医疗在线问诊小程序:开启数字化医疗新篇章

随着科技的飞速发展,医疗行业正逐步向数字化转型。其中,医疗在线问诊小程序作为一种新型的医疗健康服务模式,为人们提供了更为便捷、高效的医疗咨询服务。本文将探讨医疗在线问诊小程序的发展背景、优势及应用场景,以期为医疗行业…

WebGL开发数据可视化应用

使用WebGL进行数据可视化可以创造出令人印象深刻的交互式和动态图形。以下是一些在WebGL中开发数据可视化应用时需要考虑的步骤和技术,希望对大家有所帮助。 1.选择合适的WebGL框架或库: 使用现有的WebGL框架或库,如Three.js、Babylon.js、r…

在Ubuntu中使用python

目录 一、利用vim使用python 1、下载vim 2、使用vim创建python文件 3、编辑完成后的vim操作 4、如何运行 5、vim常见操作 二、安装Jupyter 1、更新系统 2、安装pip 注:pip无法应用的原因及解决方案 3、安装Jupyter 4、打开Jupyter 三、安装其他Python模…

qt-交通路口仿真

qt-交通路口仿真 一、演示效果二、核心代码三、程序链接 一、演示效果 二、核心代码 #include "generator.h"Generator::Generator(SimulationScene *scene):m_scene(scene),m_mode(VEHICLEMETHOD::GO_THROUGH),m_running_state(false),m_VisionOn(false),m_IsInter…

type- C口桌面显示器的重要性

添加图片注释,不超过 140 字(可选) 桌面显示器在现代生活和工作中的重要性不容忽视。选择一款适合自己需求的显示器,不仅可以提高工作效率,还能保护视力,提升生活质量。 桌面显示器的视觉体验&#xff1a…

OpenAI视频生成模型Sora的全面解析:从ViViT、Diffusion Transformer到NaViT、VideoPoet

前言 真没想到,距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史:从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月,没想OpenAI一出手,该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

C++ 网络编程学习一

C网络编程学习一 基本流程Boost网络库节点创建bufferasio tcp同步写asio tcp同步读同步阻塞方式的读写demo 基本流程 单线程流程中,服务器创建用于监听的套接字,绑定本地的ip和端口,listen函数去监听绑定的端口。 如果有客户端进行连接…

【ARMv8M Cortex-M33 系列 8.1 -- RT-Thread 堆内存 检查命令 free 实现及介绍】

文章目录 RT-Thread 堆内存 检查命令 free 实现及介绍rt_memory_info 函数验证 RT-Thread 堆内存 检查命令 free 实现及介绍 在RT-Thread系统中,通常可以通过rt_memory_info函数获取当前的堆内存使用信息,然后你可以包装这个函数来显示剩余的堆空间。rt…

SIMATIC S7-1200 PID串级控制(以巧克力加热炉温度控制为例)

文章目录 一、PID控制原理二、PID控制指令1.PID_Compact2.PID_3Step3.PID_Temp4.指令块功能对比 三、PID控制示例1.调用并组态PID_Compact2.调用被控对象仿真块3.进行预调节4.进行精确调节 四、串级控制1.调用并组态PID_Temp2.调用被控对象仿真块3.进行从控制器预调节加热4.进行…

HTML 字符实体参考清单

前言 一些字符在 HTML 中是预留的&#xff0c;拥有特殊的含义&#xff0c;比如小于号‘<’用于定义 HTML 标签的开始。如果我们希望浏览器正确地显示这些字符&#xff0c;我们必须在 HTML 源码中插入字符实体。 字符实体有三部分&#xff1a;一个和号‘&’和一个实体名…

DC电源模块在太阳能系统中的应用及优化

BOSHIDA DC电源模块在太阳能系统中的应用及优化 BOSHIDA DC电源模块在太阳能系统中有广泛的应用&#xff0c;主要用于转换太阳能电池板产生的直流电能为可用的电源。太阳能系统的优化主要集中在提高转换效率、稳定输出电压和延长电源模块的寿命等方面。 在太阳能系统中&…

图的遍历(广度优先遍历BFS,深度优先遍历DFS)

目录 图的遍历概念&#xff1a; 图的广度优先遍历&#xff08;BFS&#xff09;&#xff1a; 代码实现如下&#xff1a; 测试如下&#xff1a; 注意&#xff1a; 图的深度优先遍历&#xff08;DFS&#xff09;&#xff1a; 代码实现如下&#xff1a; 测试如下&#xff1…

护眼台灯哪个牌子好?好用又不伤眼的护眼台灯推荐

现在的孩子近视率非常高&#xff0c;如今不少低年级的孩子都已经存在近视的现象&#xff0c;究其原因主要还是学业压力过大、用眼时间过长、以及不合适的光源环境导致的。其中尤为注意孩子学习时书桌上的那一盏台灯&#xff0c;因为很多低质量的台灯在光源控制方面存在较大问题…

三防平板丨手持工业平板丨ONERugged工业三防平板丨推动数字化转型

随着科技的发展&#xff0c;数字化转型已经成为企业转型升级的必由之路。而在数字化转型中&#xff0c;三防平板作为一种重要的工具&#xff0c;可以极大地推动企业的数字化转型。本文将从以下几个方面探讨三防平板如何推动数字化转型。 一、提高工作效率 ONERugged加固平板的…

Vue+OpenLayers7入门到实战:OpenLayers加载google街景地图瓦片到地图上

返回《Vue+OpenLayers7》专栏目录:Vue+OpenLayers7 前言 本章介绍如何使用OpenLayers7在地图上加载google街景地图瓦片,无需科学上网,也可以正常访问瓦片。 二、依赖和使用 "ol": "7.5.2"使用npm安装依赖npm install ol@7.5.2使用Yarn安装依赖yarn a…