「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等操作,也会在这个过期时间将锁释放,这样的话后期的线程还是可以获取到锁的,

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

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

相关文章

图像预处理技术与算法

图像预处理是计算机视觉和图像处理中非常关键的第一步,其目的是为了提高后续算法对原始图像的识别、分析和理解能力。以下是一些主要的图像预处理技术: 1.图像增强: 对比度调整:通过直方图均衡化(Histogram Equalization)等方法改善图像整体或局部的对比度。 伽玛校正:…

MT4技术分析工具介绍:让你更好地把握市场趋势

在外汇交易市场中,技术分析是一种常用的分析手段,而MT4作为外汇交易中广泛使用的交易平台,拥有丰富的技术分析工具,能够帮助交易者更好地把握市场趋势。本文将介绍几款常用的MT4技术分析工具,帮助读者更好地理解和运用…

STM32 输入捕获模式测频率

单片机学习! 目录 文章目录 前言 一、输入捕获测频率配置步骤 二、代码示例及注意事项 2.1 RCC开启时钟 2.2 GPIO初始化 2.3 配置时基单元 2.4 配置输入捕获单元 2.5 选择从模式的触发源 2.6 配置从模式为Reset 2.7 开启定时器 总结 前言 博文介绍如何配置输入捕获电…

OpenAI 全新发布文生视频模型 Sora,支持 60s 超长长度,有哪些突破?将带来哪些影响?

Sora大模型简介 OpenAI 的官方解释了在视频数据基础上进行大规模训练生成模型的方法。 我们下面会摘取其中的关键部分罗列让大家快速get重点。 喜欢钻研的伙伴可以到官网查看技术报告: https://openai.com/research/video-generation-models-as-world-simulator…

AI破局俱乐部,你要了解的都在这里

您好,我是码农飞哥(wei158556),感谢您阅读本文,欢迎一键三连哦。💪🏻 1. Python基础专栏,基础知识一网打尽,9.9元买不了吃亏,买不了上当。 Python从入门到精通…

【C#】使用代码实现龙年春晚扑克牌魔术(守岁共此时),代码实现篇

欢迎来到《小5讲堂》 大家好,我是全栈小5。 这是《C#》系列文章,每篇文章将以博主理解的角度展开讲解, 特别是针对知识点的概念进行叙说,大部分文章将会对这些概念进行实际例子验证,以此达到加深对知识点的理解和掌握。…

使用VBA将多个txt批量转换成excel表并保存

VBA将多个txt批量转换成excel表并保存 Sub ykcbf() Set fso CreateObject("scripting.filesystemobject")Application.ScreenUpdating FalseApplication.DisplayAlerts Falsep ThisWorkbook.Path & ""On Error Resume NextFor Each f In fso.GetF…

Linux文件监控方法

Linux系统开发程序,有时候需要监控配置文件的变化,做出相应操作,下面将介绍常用的文件、目录监控方法: 函数介绍: 1.Inotify系列函数: Inotify_init(void) 系统返回一个文件描述…

mac下mysql 常用命令

mysql启动命令 在Mac OS X启动和停止MySQL服务的命令, 启动MySQL服务 sudo /usr/local/mysql/support-files/mysql.server start 停止MySQL服务 sudo /usr/local/mysql/support-files/mysql.server stop 重启MySQL服务 sudo /usr/local/mysql/support-files/mys…

大模型量化技术原理-LLM.int8()、GPTQ

近年来,随着Transformer、MOE架构的提出,使得深度学习模型轻松突破上万亿规模参数,从而导致模型变得越来越大,因此,我们需要一些大模型压缩技术来降低模型部署的成本,并提升模型的推理性能。 模型压缩主要分…

不知如何获取1688工厂档案信息,你还在为此烦恼吗?

阿里巴巴集团旗下的B2B电子商务网站,提供海量优质商品,为采购商和供应商提供交流、合作、采购等服务,是很多没有货源优势的电商卖家首选的货源途径,也是国内最大、货源种类最齐全的货源网站。 不少做跨境电商无货源的朋友都想要1…

MySQL学习记录——십삼 视图及用户、权限管理

文章目录 1、视图2、用户管理3、权限管理 1、视图 视图把查询出来的结果以表结构的形式存储起来,视图和基表有关系,两者的数据变化都会互相影响。 在查询时,假如要经常查询一条记录,select …,那么为了方便&#xff…

用html编写的招聘简历

用html编写的招聘简历 相关代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</tit…

C语言:指针与内存

C语言&#xff1a;指针与内存 内存与地址指针变量取地址指针变量解引用指针的大小 指针运算指针 - 整数指针 - 指针指针关系运算 const修饰指针字符指针野指针assert断言传址调用 内存与地址 计算机上CPU&#xff08;中央处理器&#xff09;在处理数据的时候&#xff0c;需要…

rk3568 WDG

rk3568 WDG 在嵌入式系统中,看门狗(Watchdog)是一种用于监控系统运行状态并在系统出现故障或死锁时自动重启系统的机制。 监控系统运行状态:看门狗定时器会周期性地计数,在规定的时间内如果系统未能对看门狗进行喂狗操作(即重置看门狗计数器),就会认为系统出现故障或死…

探索JDK5的新特性:革新编程体验的里程碑

引言 Java Development Kit (JDK) 5&#xff0c;于2004年发布&#xff0c;是Java发展历程中具有里程碑意义的一个版本。它不仅引入了一系列关键的编程新特性&#xff0c;还大大提升了开发者的生产力和代码质量。本文将带领大家深入了解JDK 5带来的变革性创新&#xff0c;包括泛…

自定义异常处理演示

​ 为了防止黑客从前台异常信息&#xff0c;对系统进行攻击。同时&#xff0c;为了提高用户体验&#xff0c;我们都会都抛出的异常进行拦截处理。 一、全局异常处理 编写一个异常拦截类&#xff0c;如下&#xff1a;ControllerAdvice&#xff0c;很多初学者可能都没有听说过…

《最新出炉》系列初窥篇-Python+Playwright自动化测试-19-处理鼠标拖拽-中篇

1.简介 上一篇中&#xff0c;主要是介绍了拖拽的各种方法的理论知识以及实践&#xff0c;今天宏哥讲解和分享一下划取字段操作。例如&#xff1a;需要在一堆log字符中随机划取一段文字&#xff0c;然后右键选择摘取功能。 2.划取字段操作 划取字段操作就是在一段文字中随机选…

Linux系统——http协议介绍

目录 引言——Internet起源 一、http协议——超文本传输协议 1.http相关概念 2.访问浏览器的过程 3.http协议通信过程 4.http相关技术 4.1WEB开发语言 4.2html 4.3CSS 4.4JS 5.MIME——Multipurpose Internet Mail Extensions 多用途互联网邮件扩展 6.URI URN URL的…

ubuntu配置pip

windows的pip镜像 在C:\Users\当前用户\下创建.pip文件夹在.pip下创建pip.ini文件编辑pip.ini添加如下内容 [global] index-url https://mirror.baidu.com/pypi/simple [install] trusted-host https://mirror.baidu.com/pypi ubuntu的pip镜像 当前用户的pip镜像 1. 进入用…