synchronized的优化策略

synchronized的优化策略

  • 一:synchronized 的"自适应"
    • 1.1:偏向锁
  • 二:锁消除
  • 三:锁粗化

一:synchronized 的"自适应"

锁升级的过程:
(1)未加锁的状态(无锁)
当代码中开始调用执行synchronized
(2)偏向锁
遇到锁冲突
(3)轻量级锁
冲突进一步提升
(4)重量级锁
在这里插入图片描述
上述的升级过程,针对一个锁对象来说,是不可逆的,只能升级,不能降级,一旦升级到了重量级锁,不会回退到轻量级锁(当前JVM里面的做法)

1.1:偏向锁

首次使用synchronized对对象进行加锁的时候,不是真的加锁,而只是做一个"标记"(非常轻量,几乎没有开销),如果没有别的线程尝试对这个对象加锁,就可以保持这个状态,一直到解锁(解锁也就是修改一个上述标记,也几乎没有开销).
上述过程,就相当于没有任何加锁操作,速度是非常快的.
但是,如果在偏向锁状态下,有某个线程也尝试对这个对象加锁,立即把偏向锁升级成了轻量级锁(真的加锁了,真的有互斥了).
本质上,偏向锁策略就是"懒"字具体体现,能不加锁,就不加锁,能晚加锁,就晚加锁,在很多时候能够把加锁的开销给省下.

二:锁消除

锁消除实际上是编译器的优化策略.
编译器优化:要确保优化前的逻辑和优化后的是等价的.
你代码里写了加锁操作,编译器和JVM对对你当前的代码做出判定,看这个地方到底是不是真的需要加锁,如果这里不需要加锁,就会自动的把这个加锁操作给优化掉.
比如:只有一个线程的时候,使用synchronized,不会产生线程安全问题,从而编译器就会把加锁操作给优化掉.

三:锁粗化

锁的粒度:指的是:加锁的范围内,包含多少代码,包含的代码越多,锁的粒度就越粗,反之,锁的粒度就越细.
锁粗化,也是一种加锁优化策略
有些逻辑中,需要频繁的加锁解锁,编译器就会自动的把多次细粒度的锁,合并成一次粗粒度的锁.
举个栗子:
有一天,领导给你安排了三个工作,你做完了,要给领导汇报工作.
有两种方法:
(1)分三次给领导打电话,每次打电话,都是对领导的加锁过程,这个过程是比较低效的,每次打电话,都可能会涉及到锁竞争,都可能要阻塞等待.
(2)一次电话,把三个事情都说清楚,一次加锁即可.
在这里插入图片描述

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

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

相关文章

【示例】MySQL-事务控制示例:账户转账-savepoint关键字

前言 本文讲述MySQL中的事务,以账户转账为例,体会事务的概念,并讲解事务相关的一个关键字用法:savepoint 示例 数据准备 drop table if exists account;create table account(id int primary key AUTO_INCREMENT comment ID,n…

metrology

* draw_line (3600, Row11, Column11, Row21, Column21) Row11:1168.63385826772 Column11:934.322404371585 Row12:1280.58267716535 Column12:1233.27322404372 * draw_rectangle2 (3600, Row8, Column8, Phi1, Length11, Length21) *画矩形区域 Row3:1102.91534391534 Colum…

在Windows下面的vscode配置cmake使用vcpkg包管理器

安装 vscode下载地址 cmake下载地址 vcpkg下载地址 创建CMake项目 // main.cpp #include <fmt/core.h>int main() {fmt::print("Hello World!\n");return 0; }// CMakeLists.txtcmake_minimum_required(VERSION 3.10)project(HelloWorld)find_package(fmt…

没有公网IP怎么办?

在网络通信中&#xff0c;公网IP是指可以直接访问互联网的IP地址。由于各种原因&#xff0c;有一些用户可能没有自己的公网IP地址。那么没有公网IP的情况下&#xff0c;我们应该怎么办呢&#xff1f; 局域网的限制 我们需要了解局域网的概念。局域网是指在一个相对较小的范围内…

LAMMPS如何识别多孔结构的孔隙及其大小

关注 M r . m a t e r i a l , \color{Violet} \rm Mr.material\ , Mr.material

redis 数据迁移到rds2214(TongRDS-2.2.1.3.Load版 by lqw)

​ 文章目录 一.备份redis文件 vi redis.conf &#xff0c;看看有没有这两行设置&#xff0c;有的话改成跟下面的一致&#xff1a; appendonly yes appendfilename “appendonly.aof” 之后连接redis客户端&#xff0c;输入INFO persistence&#xff0c;如图所示即为开启成功…

生产环境一些十分有用的JVM参数

-Xms{x}m &#xff1a;初始化堆内存大小 -Xmx{x}m : 最大堆内存大小 一般将Xms Xmx 这两个参数值设为相同值&#xff0c;防止反复GC、导致内存抖动。 -Xloggc:{path}_%p_%t.log: GC日志文件&#xff0c;这对垃圾回收器的调整和内存问题诊断有重要作用。其中%p表示进程号占位符…

【C++学习】C++智能指针:提高代码安全与性能的利器

文章标题 智能指针的提出智能指针概念及使用RAII 智能指针的原理C库多种智能指针详解版本一&#xff1a;std::auto_ptr&#xff08;C98&#xff09;1. std::auto_ptr 使用2. std::auto_ptr 原理3. std::auto_ptr 模拟实现 版本二&#xff1a;unique_ptr (C11)1. unique_ptr 的使…

算法—分治

分而治之:指的是当主问题可以被分解为一个相同次级问题加相同基本问题时&#xff0c;采用这种思想&#xff0c;基本问题指问题规模最小时的情况&#xff0c;次级问题是指主问题的n级降低n-1级的问题。 具体实现&#xff1a;多数采用递归操作分解&#xff0c;然后递归操作&#…

【Linux】编写一个 shell 脚本执行

在Linux中编写和执行脚本相对简单。下面是一个基本的步骤指南&#xff0c;帮助你创建一个简单的bash脚本并运行它&#xff1a; 1. 创建脚本文件 首先&#xff0c;你需要使用文本编辑器创建一个新的文件。这个文件通常会有 .sh 的扩展名&#xff0c;以表明它是一个shell脚本。…

Android 纵向双选日历

这个日历的布局分两部分&#xff0c;一部分是显示星期几的LinearLayout&#xff0c;另外就是一个RecyclerView&#xff0c;负责纵向滚动了。 工具类&#xff1a; implementation com.blankj:utilcode:1.17.3上activity_calendar代码&#xff1a; <?xml version"1.0&…

研究了一款Vue2开发的Markdown编辑器

最近突然喜欢开始写作了&#xff0c;写笔记&#xff0c;写日记&#xff0c;写总结&#xff0c;各种写。所以&#xff0c;想要打造一个自己喜欢的编辑器&#xff0c;于是开始研究。 首先来看看我从Github丄扒拉到的这个开源的代码&#xff1a; 运行起来以后效果是这样的&…

探究C++20协程(1)——C++协程概览

什么是协程&#xff1f; 协程就是一段可以挂起&#xff08;suspend&#xff09;和恢复&#xff08;resume&#xff09;的程序&#xff0c;一般而言&#xff0c;就是一个支持挂起和恢复的函数。 一般情况下&#xff0c;函数一旦开始&#xff0c;就无法暂停。如果一个函数能够暂…

用于扩展Qt自身的插件(下)

扩展Qt自身的插件 引言必须满足项创建插件示例代码生成插件配置加载插件的环境创建使用插件的项目配置库和头文件依赖的步骤:应用程序代码运行结果总结引言 本文继上篇的扩展Qt自身的插件,接着记录Qt自身的插件,只不过本文提及的用于扩展Qt自身的插件是可以在QtCreator的设…

走进MySQL:从认识到入门(针对初学者)

一&#xff0c;引言 MySQL是一款久负盛名且广泛应用的关系型数据库管理系统&#xff0c;自1995年Michael Widenius和David Axmark在瑞典和芬兰发起研发以来&#xff0c;其发展历程可谓辉煌且深远。作为开源软件的代表&#xff0c;MySQL以其卓越的成本效益、高性能及高可靠性赢得…

关于 Amazon DynamoDB 的学习和使用

文章主要针对于博主自己的技术栈&#xff0c;从Unity的角度出发&#xff0c;对于 DynamoDB 的使用。 绿色通道&#xff1a; WS SDK for .NET Version 3 API Reference - AmazonDynamoDBClient Amazon DynamoDB Amazon DynamoDB is a fast, highly scalable, highly available,…

Harmony鸿蒙南向驱动开发-RTC接口使用

功能简介 RTC&#xff08;real-time clock&#xff09;为操作系统中的实时时钟设备&#xff0c;为操作系统提供精准的实时时间和定时报警功能。当设备下电后&#xff0c;通过外置电池供电&#xff0c;RTC继续记录操作系统时间&#xff1b;设备上电后&#xff0c;RTC提供实时时…

【Java SE】11.认识异常

目录 1.异常的概念与体系结构 1.1异常的概念 1.2异常的体系结构 1.3异常的分类 2.异常的处理 2.1防御式编程 2.2异常的抛出 2.3异常的捕获 2.3.1异常声明throws 2.3.2try-catch捕获并处理 2.3.3finally 2.4异常的处理流程 3.自定义异常类 1.异常的概念与体系结构 …

MAC OS关闭SIP(navicat 无法保存密码)

最近安装navicat&#xff08;16.3.7&#xff09;时,安装后无法保存密码,保存密码会报错如下&#xff1a; 因为用的破解版&#xff0c;一开始是打不开的&#xff0c;用自带的修复软件修复后就可以打开了&#xff0c;但是保存密码就会报错&#xff0c;按照网上的一些操作 1、卸载…

蓝桥杯嵌入式(G431)备赛笔记——RTC

// RTC time// 声明一个变量 rtc_tick 用于记录上次 RTC 处理的时间 u32 rtc_tick 0;// 声明结构体变量 D 用于存储 RTC 的日期信息 RTC_DateTypeDef D;// 声明结构体变量 T 用于存储 RTC 的时间信息 RTC_TimeTypeDef T;// RTC_proc 函数&#xff0c;用于处理 RTC 时间 void R…