锁策略, cas 和 synchronized 优化过程
1.1 常見的鎖策略
-
預測鎖衝突概率
-
樂觀鎖:加鎖的時候,假設出現鎖衝突的概率不大。圍繞加鎖做的工作會更少。
-
悲觀鎖:加鎖的時候,假設鎖出現衝突的概率很大。圍繞加鎖做的工作會更多。
-
synchronized “自適應” 初始是樂觀的。鎖衝突達到一定程度就會轉變爲悲觀的。
-
加鎖開銷(時間開銷)
-
重量級鎖
-
輕量級鎖
-
挂起等待鎖:悲觀鎖/重量級鎖的一種典型實現。讓出cpu資源,過一段時間通過其他途徑得知,再伺機而動。
-
自旋鎖:樂觀鎖/輕量級鎖的一種典型實現。忙等,等待過程中不釋放cpu資源,反復檢測鎖是否被釋放。一旦釋放立即有機會獲取到鎖。
-
公平鎖:先來後到
-
非公平鎖:synchronized ,剩下的都公平競爭
-
可重入鎖 1)記錄當前是哪個綫程使用這個鎖 2)在加鎖是判定,申請當時鎖的綫程是否就是鎖的持有者綫程 3)計數器,記錄加鎖次數,從而確定何時真正釋放鎖
-
不可重入鎖
-
死鎖問題:針對一把鎖連續兩次加鎖就可能出現死鎖,可以把鎖設置成“可重入鎖”
-
讀寫鎖
-
synchronized并非是讀寫鎖
-
把加鎖操作分爲“讀加鎖”和”寫加鎖“,提供了兩種加鎖api,解鎖的api相同。
-
如果,多个线程,同时读这个变量,没有线程安全问题。但是,一个线程读/一个线程写或者两个线程都写就会产生问题,
-
如果两个线程,都是按照读方式加锁,此时不会产生锁冲突。如果两个线程,都是加写锁,此时会产生锁冲突。如果一个线程读锁,一个是写锁,也会产生锁冲突。
-
系統内置鎖,可重入讀寫鎖ReentrantReadWriteLock。内部類ReentrantReadwriteLock.ReadLock/ReentrantReadWriteLock.WriteLock。lock/unlock方法。
1.2 synchronized原理
-
乐观悲观自适应
-
重量轻量,自适应
-
自旋挂起等待,自适应
-
非公平锁
-
可重入锁
-
不是读写锁
-
鎖升級:刚开始使用synchronized加锁,首先锁会处于“偏向锁”状态。遇到线程之间的锁竞争,升级到“轻量级锁“。进一步的统计竞争出现的频次,达到一定程度之后,升级到“重量級锁”。
-
synchronized加锁的时候,会经历无锁=>偏向锁=>轻量级锁=>重量级锁。出現競爭/競爭激烈。鎖升級對當前jvm來説不可逆。
-
偏向鎖不是真鎖,只是做個標記,比較輕量高效。
-
鎖消除。(編譯器優化策略)
-
鎖粗化。(編譯器優化策略)。鎖的粒度。synchronized{}裏代碼越多,粒度越粗。把多個”細粒度“的鎖合并成”粗粒度“的鎖。
1.3 CAS
-
compare and swap
-
比较内存和cpu寄存器中的内容.如果发现相同,就进行交换(交换的是内存和另一个寄存器的内容)
-
比较内存和寄存器1中的值,是否相等如果不相等,就无事发生。如果相等,就交换内存和寄存器2的值
-
此处一般只是关心,内存交换后的内容。不关心寄存器2交换后的内容。相當於”賦值“
-
一個cpu指令就能完成。可以寫”無鎖化編程“。
-
使用場景:
-
基於CAS實現”原子類“。對int/long等類型進行封裝,從而可以原子地完成++等操作。標準庫裏也有。
package thread; import java.util.concurrent.atomic.AtomicInteger; public class Demo34 {// private static int count = 0;private static AtomicInteger count = new AtomicInteger(0); public static void main(String[] args) throws InterruptedException {Thread t1 = new Thread(() -> {for (int i = 0; i < 50000; i++) {count.getAndIncrement(); // count++ // count.incrementAndGet(); // ++count // count.getAndDecrement(); // count-- // count.decrementAndGet(); // --count // count.getAndAdd(10); // count+= 10}});Thread t2 = new Thread(() -> {for (int i = 0; i < 50000; i++) {// count++;count.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join(); // 通过 count.get() 拿到原子类内部持有的真实数据.System.out.println("count = " + count.get());} }
-
相关文章:

锁策略, cas 和 synchronized 优化过程
1.1 常見的鎖策略 預測鎖衝突概率 樂觀鎖:加鎖的時候,假設出現鎖衝突的概率不大。圍繞加鎖做的工作會更少。 悲觀鎖:加鎖的時候,假設鎖出現衝突的概率很大。圍繞加鎖做的工作會更多。 synchronized “自適應” 初始是樂觀的。鎖…...

【HTML5】html5开篇基础(2)
1.❤️❤️前言~🥳🎉🎉🎉 Hello, Hello~ 亲爱的朋友们👋👋,这里是E绵绵呀✍️✍️。 如果你喜欢这篇文章,请别吝啬你的点赞❤️❤️和收藏📖📖。如果你对我的…...

大数据新视界 --大数据大厂之 Reactjs 在大数据应用开发中的优势与实践
💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…...

【论文阅读笔记】TOOD: Task-aligned One-stage Object Detection
论文代码:https://github.com/fcjian/TOOD 文章目录 论文小结论文简介论文方法Task-aligned Head(T-Head)T-Head伪代码解释 Task Alignment Learning(TAL)Task-aligned Sample AssignmentTask-aligned Loss 论文实验消…...

类中的特殊内容
仿照string类,自己手动实现 My_string #include <iostream> #include <string.h> using namespace std;class My_string { private:int len;int size;char *ptr; public:My_string():size(15),len(0){ptrnew char[size];ptr[0]\0;}My_string(const char…...

network request to https://registry.npmjs.org/xxx failed, reason: connect ETIM
目录: 1、问题描述2、解决方案3、npm镜像仓库替换 1、问题描述 npm install 时,报错:npm ERR! network request to https://registry.npmjs.org/postcss-pxtorem failed, reason: connect ETIMEDOU npm ERR! code ETIMEDOUT npm ERR! errno…...

MQ入门(二):java客户端SpringAMQP
目录 1.SpringAMQP 1.1.导入demo工程 1.2.快速入门 1.2.1.消息发送 1.2.2.消息接收 1.2.3.测试 1.3.WorkQueues模型 1.4.交换机类型 1.4.1.Fanout交换机 1.4.2.Direct交换机 1.4.3.Topic交换机 1.5.声明队列和交换机 1.5.1.基于注解声明 1.6.消息转换器 1.6.1.测…...

软技能与AI技术的融合
一、引言 ---- 随着人工智能(AI)和生成式人工智能(AIGC)如ChatGPT、Midjourney、Claude等大语言模型的迅速崛起,AI辅助编程工具已经变得越来越普遍。这不仅意味着程序员的工作方式正在发生深刻的变革,同…...

在视频上绘制区域:使用Vue和JavaScript实现交互式画布
在数字时代,交互式媒体内容的创建和消费变得越来越普遍。特别是视频内容,它不仅提供了视觉信息,还允许用户与之互动,从而增强了用户体验。本文将介绍如何使用Vue.js框架和JavaScript创建一个交互式组件,该组件允许用户…...

31. RabbitMQ顺序消费
1. 前言 上个小节中我们介绍了 RabbitMQ 中如何防止消息丢失,即保证消息发送的 At Least Once 性质,除此之外,如何防止消息被重复消费,即保证消息消费的 Exactly Once 性质,也是业务逻辑中需要考虑的问题。 2. 消息消费顺序 面试官提问:业务中使用了 RabbitMQ 消息队列…...

BERT-BiLSTM-CRF模型实战
文章目录 BERT-BiLSTM-CRF模型项目结构数据预处理运行环境使用方法关于BERT-BiLSTM-CRF参考文章BERT-BiLSTM-CRF模型 使用谷歌的BERT模型在BiLSTM-CRF模型上进行预训练用于中文命名实体识别。 项目结构 bert_bilstm_crf_ner_pytorchtorch_nerbert-base-chinese --…...

npm 安装 与 切换 淘宝镜像
一、镜像源 npm默认镜像源是国外的,安装依赖速度较慢,使用国内的镜像源速度会快一些。 1、设置淘宝镜像源: #最新地址 淘宝 NPM 镜像站喊你切换新域名啦! npm config set registry https://registry.npm.taobao.org(弃用了&…...

在Windows系统上安装的 Arrow C++ 库
在Windows系统上安装的 Arrow C 库 正文第一步第二步第三步第四步注: 检查是否安装成功 吐槽 正文 第一步 git clone gitgithub.com:apache/arrow.git第二步 打开powershell (好像cmd也可以,不过我试了powershell中不报错,cmd中报错,不是很清楚为什么) 打开arrow的目录 cd …...

格雷母线电缆头安装方法视频-武汉正向科技
正向科技|格雷母线电缆头怎么处理? 正向科技格雷母线采用整体热压工艺生产,一次成型,防护等级 IP67,用在直线或环形位移检测,抗污染能力强,防水、油、灰尘、蒸汽等,能在强粉尘、高温的环境下稳定…...

统信服务器操作系统【Cron定时任务服务】
Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…...

微前端中的路由加载流程
1. 初始化基座应用 基座应用:基座应用是微前端架构中的主应用,负责管理和协调各个子应用的加载和卸载。 初始化:基座应用在启动时会初始化路由配置,注册各个子应用的路由。 2. 注册子应用 子应用需要向基座应用注册自己的路由和…...

Axure大屏可视化模板:跨领域数据分析平台原型案例
随着信息技术的飞速发展,数据可视化已成为各行各业提升管理效率、优化决策过程的重要手段。Axure作为一款强大的原型设计工具,其大屏可视化模板在农业、园区、城市、企业数据可视化、医疗等多个领域得到了广泛应用。本文将通过几个具体案例,展…...

机器学习(1)——线性回归、线性分类与梯度下降
文章目录 线性回归线性分类线性可分数据线性不可分数据逻辑回归支持向量机 梯度下降批量梯度下降随机梯度下降批量随机梯度下降 线性回归 概述: 在一元线性回归中,我们假设目标变量y与特征变量x存在线性关系,模型表达式为: y …...

完整的端到端的中文聊天机器人
这段代码是一个完整的端到端的中文聊天机器人的实现,包括数据处理、模型训练、预测和图形用户界面(GUI),下面是对各个部分功能的详细说明: 1. 导入必要的库 import os os.environ[CUDA_LAUNCH_BLOCKING] = 1import torch import torch.nn as nn import torch.optim as o…...

【有啥问啥】Stackelberg博弈方法:概念、原理及其在AI中的应用
Stackelberg博弈方法:概念、原理及其在AI中的应用 1. 什么是Stackelberg博弈? Stackelberg博弈(Stackelberg Competition)是一种不对称的领导者-追随者(Leader-Follower)博弈模型,由德国经济学…...

【UI自动化】前言
系列文章目录 【UI自动化】前言 自动化不能代替手工测试,自动化都是以手工测试为基础,自动化测试实现的步骤要依赖手工; 文章目录 系列文章目录【UI自动化】前言 自动化测试的类型自动化解决的问题什么是UI测试测试分类一、使用UI自动化的…...

Unity对象池的高级写法 (Plus优化版)
唐老师关于对物体分类的OOD的写法确实十分好,代码也耦合度也低,但是我有个简单的写法同样能实现一样的效果,所以我就充分发挥了一下主观能动性 相较于基本功能,这一版做出了如下改动 1.限制了对象池最大数量,多出来的…...

vue3<script setup>中computed
在 Vue 3 中,<script setup> 语法糖是 Composition API 的一种简化写法,它允许你更简洁地编写组件逻辑。在 <script setup> 中使用 computed 与在普通 <script> 标签中使用 Composition API 的方式类似,但通常我们会借助 i…...

【已解决】使用JAVA语言实现递归调用-本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。
本关任务:用循环和递归算法求 n(小于 10 的正整数) 的阶乘 n!。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入:1…...

BiRefNet 教程:基于 PyTorch 实现的双向精细化网络
BiRefNet 教程:基于 PyTorch 实现的双向精细化网络 BiRefNet 是一个图像分割网络,专注于复杂任务如背景移除、掩码生成、伪装物体检测、显著性目标检测等。该模型结合了编码器、解码器、多尺度特征提取、以及梯度监督机制,能够有效处理不同类…...

Oracle 数据库安装和配置指南(新)
目录 1. 什么是Oracle数据库? 2. 安装前的准备工作 2.1 硬件要求 2.2 软件要求 2.3 下载Oracle安装包 3. Oracle数据库的安装步骤 3.1 Windows系统安装步骤 3.2 Linux系统安装步骤 4. 配置Oracle数据库 4.1 设置环境变量(Linux) 4.…...

JavaScript的注释与常见输出方式
注释 源码中注释是不被引擎所解释的,它的作用是对代码进行解释。Javascript 提供两种注释的写法:一种是单行注释,用//起头;另一种是多行注释,放在/*和*/之间。 单行注释: //这是单行注释 多行注释: /*这是 多行 注…...

深入探索Android开发之Java核心技术学习大全
Android作为全球最流行的移动操作系统之一,其开发技能的需求日益增长。本文将为您介绍一套专为Android开发者设计的Java核心技术学习资料,包括详细的学习大纲、PDF文档、源代码以及配套视频教程,帮助您从Java基础到高级特性,再到A…...

vue3 选择字体的颜色,使用vue3-colorpicker来选择颜色
1、有的时候我们会用到颜色的选择器,像element-plus提供了,但是ant-design-vue并没有: 这个暂时没有看到: 但是Ant Design 5的版本有,应该不是vue的。 2、使用第三方提供的vue3-colorpicker:storybook/cli…...

windows C++ 并行编程-使用消息块筛选器
本文档演示了如何使用筛选器函数,使异步消息块能够根据消息的有效负载接受或拒绝消息。 创建消息块对象(例如 concurrency::unbounded_buffer、concurrency::call 或 concurrency::transformer)时,可以提供筛选器函数,用于确定消息块是接受还…...