synchronized的实现原理


程序员的公众号:源1024获取更多资料,无加密无套路!

最近整理了一波电子书籍资料,包含《Effective Java中文版 第2版》《深入JAVA虚拟机》,《重构改善既有代码设计》,《MySQL高性能-第3版》,《Java并发编程实战》等等
获取方式: 关注公众号并回复 电子书 领取,更多内容持续奉上


synchronized 

synchronized 是 JVM 的内置锁,基于 Monitor 机制实现。每一个对象都有一个与之关联的监视器 (Monitor),这个监视器充当了一种互斥锁的角色。当一个线程想要访问某个对象的 synchronized 代码块,首先需要获取该对象的 Monitor。如果该 Monitor 已经被其他线程持有,则当前线程将会被阻塞,直至 Monitor 变为可用状态。当线程完成 synchronized 块的代码执行后,它会释放 Monitor,并把 Monitor 返还给对象池,这样其他线程才能获取 Monitor 并进入 synchronized 代码块。

作用

 synchronized也叫同步锁,解决的是多个线程之间对资源的访问一致性。换句话说,就是保证在同一时刻,被synchronized修饰的方法或代码块只有一个线程在执行,其他线程必须等待,解决并发安全问题。

原理

  1. synchronized的实现是基于对象内部的锁(也称为监视器锁),每个锁关联着一个对象实例。

  2. 当synchronized作用于对象时,它就会尝试获取这个对象的锁,如果锁没有被其他线程占用,则当前线程获取到锁,并可以执行同步代码块;如果锁已经被其他线程占用,那么当前线程就会阻塞在同步块之外,直到获取到锁才能进入同步块。

  3. synchronized还支持作用于类上,此时它锁住的是整个类,而不是类的某个实例。在这种情况下,由于只有一个锁存在,所以所有使用该类的线程都需要等待锁的释放。

  4. 在JVM内部,每个Java对象都有头信息,其中包含了对象的一些元信息和状态标志。synchronized通过修改头信息的状态标志来实现锁的获取和释放。

  5. synchronized还支持可重入性,即在同一个线程中可以多次获取同一个锁,这样可以避免死锁问题。

  6. Java虚拟机会通过锁升级的方式来提升synchronized的效率,比如偏向锁、轻量级锁和重量级锁等机制,使得在竞争不激烈的情况下,synchronized的性能可以达到与非同步代码相当的水平。

 系列文章索引

MyBatis的插件能在哪些地方进行拦截?

了解MyBatis的缓存机制吗

面试官:谈谈对volatile的理解

Spring中用到了哪些设计模式

面试官:说一下SQL的执行过程

线程池的工作原理


 

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

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

相关文章

Redis--14--BigKey 和 热点Key

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 BigKey1.什么是bigkey2.bigkey的危害3.发现bigkeyscan 4.解决bigkey 什么是热点Key?该如何解决1. 产生原因和危害原因危害 2.发现热点key预估发现客户端…

基于深度学习的肺炎CT图像检测诊断系统

欢迎大家点赞、收藏、关注、评论啦 ,由于篇幅有限,只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 深度学习在肺炎CT图像检测诊断方面具有广泛的应用前景。以下是关于肺炎CT图像检测诊断系统的介绍: 任务…

【STM32】STM32学习笔记-软件安装(03)

00. 目录 文章目录 00. 目录01. MDK安装02. Keil5注册03. 支持包安装04. ST-LINK驱动安装05. USB转串口驱动06. 附录 01. MDK安装 MDK 源自德国的 KEIL 公司,是 RealView MDK 的简称。在全球 MDK 被超过 10 万的嵌入式开发工程师使用。目前最新版本为: …

本地源文件-丰富的图表-

D:\FineReport_11.0\webapps\webroot\WEB-INF\reportlets\demo\basic 图表类型:http://localhost:8075/webroot/help/demo.html 可视化图表,丰富的图表:help/demo.html http://localhost:8075/webroot/decision#management/directory 参数查询/条件查询与图…

HTML块元素和行内元素

HTML块元素和行内元素 1.分类2.块元素3.行内元素 1.分类 在HTML中,根据元素的表现形式,一般可以分为两类: 块元素(block)行内元素(inline) 2.块元素 在HTML中,块元素在浏览器显示…

12.3_黑马MybatisPlus笔记(上)

目录 02 03 04 05 06 07 ​编辑 thinking:system.out::println?​编辑 thinking:list.of? 08 thinking:RequestParam和 ApiParam注解使用? thinking:RequestParam 和PathVariable的区别? ​编辑 ​编…

栈的链式存储(详解)

栈的链式存储 栈的链式存储是通过链表来实现的,每个节点包含一个元素和一个指向下一个节点的指针。链式存储的栈不需要提前分配内存空间,可以动态地增加或减少元素。 在链式存储中,栈顶元素通常是链表的头节点,栈底元素是链表的…

识KDJ指标,看懂超买超卖信号

一、认识KDJ 1、KDJ的含义 KDJ分析股票中短期趋势的一个常用指标,中文名称“随机指标”。它是一个综合考虑股票最高价、最低价和收盘价的技术指标,能够帮助我们根据历史价格预测出股票未来的价格走势。在实际应用的过程中,它的短期预测功能要…

AArch64中的虚拟化

运行在EL2或更高级别的软件具有对虚拟化的几个控制权限: • 第二阶段翻译(Stage 2 translation) • EL1/0指令和寄存器访问trapping • 虚拟异常生成 非安全状态和安全状态下的异常级别(ELs)如下图所示: 在…

使用Java语言实现变量互换

一、 java运算 通过异或运算符实现两个变量的互换 import java.util.Scanner;public class ExchangeValueDemo {public static void main(String[] args){try (Scanner scan new Scanner(System.in)) {System.out.println("请输入A的值:");long A sca…

Android实验:绑定service实验

目录 实验目的实验内容实验要求项目结构代码实现代码解释结果展示 实验目的 充分理解Service的作用,与Activity之间的区别,掌握Service的生命周期以及对应函数,了解Service的主线程性质;掌握主线程的界面刷新的设计原则&#xff…

Linux 编译安装colmap

COLMAP可以作为独立的app,通过命令行或者图形交互界面使用,也可以作为一个库被包含到其他源代码中。 这里记录一下编译安装colmap的过程,首先需要安装好CUDA,CUDA具体安装过程这里就不赘述了。在GitHub上下载源代码,我…

计算机网络的性能

目录 一、计算机网络的性能指标——宽带 二、计算机网络的性能指标——时延 三、计算机网络的性能指标——时延带宽积 四、计算机网络的性能指标——往返时延 五、计算机网络的性能指标——吞吐量 六、计算机网络的能能指标——利用率 计算机网络的定义:计算机网络时…

策略设计模式

package com.jmj.pattern.strategy;public interface Strategy {void show(); }package com.jmj.pattern.strategy;public class StrategyA implements Strategy{Overridepublic void show() {System.out.println("买一送一");} }package com.jmj.pattern.strategy;p…

力扣日记12.3-【二叉树篇】二叉树的所有路径

力扣日记:【二叉树篇】二叉树的所有路径 日期:2023.12.3 参考:代码随想录、力扣 257. 二叉树的所有路径 题目描述 难度:简单 给你一个二叉树的根节点 root ,按 任意顺序 ,返回所有从根节点到叶子节点的路径…

中序和前/后序遍历构造二叉树———通用做法

1. 前序和中序遍历 **思路:我们每一次一定可以根据递归确定根节点是哪个,就是前序第一个数,然后找中序遍历这个点,看左子树有几个节点,右子树有几个节点,然后就可以根据节点个数,递归左子树和右…

什么是跨站脚本攻击

跨站脚本攻击 1. 定义2. 跨站脚本攻击如何工作3. 跨站脚本攻击类型4. 如何防止跨站脚本攻击 1. 定义 跨站脚本攻击(Cross-site Scripting,通常称为XSS),是一种典型的Web程序漏洞利用攻击,在线论坛、博客、留言板等共享…

「C++」位图和布隆过滤器

💻文章目录 位图概念位图的实现位图的应用 布隆过滤器概念布隆过滤器的哈希函数布隆过滤器的插入布隆过滤器的查找布隆过滤器的删除 📓总结 位图 概念 所谓位图,就是在每一位bit位上存放某种状态,1就代表存在,0就代表…

SpringSecurity 三更草堂 学习笔记

SpringSecurity从入门到精通 0. 简介 Spring Security 是 Spring 家族中的一个安全管理框架。相比与另外一个安全框架Shiro,它提供了更丰富的功能,社区资源也比Shiro丰富。 一般来说中大型的项目都是使用SpringSecurity 来做安全框架。小项目有Shiro的…

三菱(MITSUBISHI)CNC数据采集

一,概述 前面介绍过,三菱CNC数据采集一般有两种方法: (1)通过官方A2 API(也叫EZSocket)进行数据采集,需要安装A2驱动包(仅适用于windows系统) (…