CAS详谈---无锁的锁机制

假设有多个线程想要操作同一个资源对象,我们首先想到的是使用互斥锁,但是互斥锁是悲观的

悲观,即操作系统会悲观的认为如果不严格同步线程调用,那么一定会产生异常,所以互斥锁会将资源锁定,只供一个线程使用,而阻塞其他线程。

但如果大部分操作是读操作,就没必要在每次调用时锁定资源,或者是同步代码块的执行耗时远远小于线程切换的耗时,这就本末倒置。

因此,我们在一些情况下,不想让操作系统那么悲观,不想过度使用互斥锁。思考是否可以不对共享资源进行锁定,也能对线程的调用进行协调?--->引出CAS

CAS(compare and swap比较然后交换)

举例

假设资源对象为女神,手中的牌子正面为0,反面为1,0表示今天有空,并且表示谁先约到就和谁先共进晚餐,1表示没空。

现有线程A和线程B,且牌子为0;此时A线程先抢到时间片(女神)并将牌子改为1,线程B虽然也到了,但是已经发现牌子状态被改变,只好遵守规则。

当资源状态为0的一瞬间,AB线程都读到了,并且认为当前资源对象的状态值为0,此时它们会各自产生两个值old value(代表读到的资源对象的状态值)new value(代表期望将资源对象状态值更新为想要的值),此时读到的状态值old value为0,new value为1(因为自己把值改为1,就表示已经约上了)

两个线程都去争抢,如果线程A抢到了时间片,将old value与资源对象的状态值进行compare比较发现一致,于是将牌子(状态值)swap为new value,线程B慢了一步,比较发现状态值已经被改为了1,和old value不一致,放弃swap操作 。

但是我们并不会让线程B直接放弃,而是使其自旋(即不断地重试CAS操作) ,并且会配置自旋次数防止死循环,如果在自旋的过程中发现牌子状态值变成了0,则会再次去争抢约会机会,如果线程B耐心耗尽(配置的自旋次数),则会放弃,不再打扰。

代码实现非常简单,但是可以发现并没有进行同步操作,说明线程还是不安全的,是否会出现线程AB同时获得资源,三个人约会?如果想解决同步问题,还是要加锁吗?

答案是,各种不同架构的CPU都提供了指令级别的CAS原子操作,CPU已经原生的支持了CAS

通过CAS实现同步,不会锁定资源,而且当某一个线程需要修改共享的资源对象时,总是会乐观的认为其状态值没有被其他线程修改过(即不会出现同时抢占资源的情况),而是每次都是由自己去compare状态值。

虽然该机制称为乐观锁,但并不恰当,因为并没有用到锁,而是无锁的同步机制

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

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

相关文章

Django CORS配置方案

参考 https://pypi.org/project/django-cors-headers/ 在setting.py中设置 INSTALLED_APPS [......corsheaders, #添加此行 ]MIDDLEWARE[......corsheaders.middleware.CorsMiddleware, #添加此行django.middleware.common.CommonMiddleware,#django.middleware.csrf.CsrfVi…

【动手学深度学习】7.5 批量规范化(个人向笔记)

训练深层神经网络是十分困难的,特别是在较短的时间内使它们收敛更加棘手。而本节的批量规范化(batch normalization) 可以持续加速深层网络的收敛速度结合下节会介绍道德残差块,批量规范化使得研究人员能够训练100层以上的网络 1.…

el-input设置placeholder字体大小

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、el-input设置placeholder字体大小? 一、el-input设置placeholder字体大小? .el-input__inner::placeholder {font-size: 12px;}

nbsaas vue3管理后台框架

nbsaas vue3管理后台框架 一、项目概述 Nbsaas Admin Vue 是一个基于 Vue.js 3.0 构建的轻量级后台管理系统,结合了现代前端技术栈的最佳实践,旨在帮助开发者快速构建具有高可扩展性和良好用户体验的后台管理系统。该项目拥有简洁的 UI 设计&#xff0…

Hikyuu教程 | 滚动回测与滚动寻优系统

前面介绍了如何使用 hikyuu 进行策略回测参数优化,同时也提到了这种简单的参数优化本质其实是对历史数据的过拟合,通常并不具备直接使用的意义。那么有什么办法来减缓这种过拟合影响,让参数优化发挥实际的作用呢?答案是——使用滚…

使用shell脚本自动重启服务

服务器后台运行的一些服务,有的时候由于高压操作导致服务崩溃时,总是得远程登录服务器,然后重启服务。 可以写shell脚本自动检测服务是否在运行,如果崩溃了就重启。 使用nohup在后台启动服务: nohup 服务启动命令所…

ifconfig 和 ip addr

1. 工具所属套件 ifconfig:属于较老的 net-tools 套件。曾是 Unix 和 Linux 系统上广泛使用的工具。ip addr:属于较新的 iproute2 套件。它取代了 ifconfig,并逐渐成为现代 Linux 系统上更常用的工具。 2. 功能覆盖范围 ifconfig&#xff…

Java之数组详解

一、数组的概念 数组(Array)是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,通过编号(索引)的方式对这些数据进行统一管理。数组是程序设计中的一种基本数据结构,用于存储相同类型…

源码编译方式安装htppd软件

一.源码编译安装httpd软件 1.安装阿帕奇的依赖,安装apr软件,阿帕奇正常运行的环境这个环境就是apr。 2.安装apr-util软件,主要提供针对apr环境的管理工具, 3.安装阿帕奇软件即httpd软件。 如上图所示,就是三个软件的…

E38.【C语言】练习:数据结构时间复杂度的计算

目录 1.二分法的时间复杂度 解: 2.求阶乘的时间复杂度 解: 3.递归实现斐波那契数,求时间复杂度 解: 4.时间复杂度的排名 备注:有关时间复杂度的讲解参见80.【C语言】数据结构之时间复杂度 1.二分法的时间复杂度 (代码来自E7.【C语言】练习:在一个有序数组中…

RK3568笔记六十六:Live555推流

若该文为原创文章,转载请注明原文出处。 前面移植了live555,记录使用rk3568推流 一、流程 推流过程是在前面RTMP工程上修改的。RTMP推流是采集摄像头数据,AI推理,编码成H264通过FFMEPG推流,现在把FFMPEG改成使用Live555. 步骤: 1、使用opencv采集摄像头数据 2、初始化…

CentOS 7 yum失效的解决办法

文章目录 一、CentOS 7停止维护导致yum失效的解决办法解决方案 提示:以下是本篇文章正文内容,下面案例可供参考 一、CentOS 7停止维护导致yum失效的解决办法 020 年,CentOS 项目与红帽联合宣布将全部投资转向 CentOS Stream,这是…

SpringBoot项目热部署-devtools

DevTools 会使用两个类加载器&#xff08;一个用于加载不变的类&#xff0c;一个用于加载可能会变化的类&#xff09;&#xff0c;每次重启只重新加载管理变化的类的加载器&#xff0c;因此会快很多 1.导入依赖 <dependency> <groupId>org.springframework.boot&l…

第28周:Transformer 实现文本分类 - Embedding版

目录 前言 一、前期准备 1.1 环境安装 1.2 加载数据 二、数据预处理 2.1 构建词典 2.2 进行one-hot编码 2.3 自定义数据集类 2.4 定义填充函数 2.5 构建数据集 三、模型构建 3.1 定义位置编码器 3.2 定义Transformer模型 3.3 定义训练函数 3.4 定义测试函数 四、…

RabbitMQ高级特性详解

前言 RabbitMQ是一款广泛使用的开源消息队列软件&#xff0c;它基于AMQP&#xff08;Advanced Message Queuing Protocol&#xff09;标准实现。本文将带你深入了解RabbitMQ的一些高级特性&#xff0c;包括消息确认、死信队列、延迟队列、事务处理以及消息分发策略等&#xff…

HCIE-Datacom题库_01_防火墙【18道题】

一、单选题 1.相比较于路由器、交接机&#xff0c;防火墙转发独有的模块为? 交换网板 MPU LPU SPU 解析&#xff1a; SFU&#xff08;Switch Fabric Unit&#xff09;&#xff1a;交换网板&#xff0c;负责整个系统的数据平面数据平面提供高速无阻塞数据通道&#xff0…

关于SOCKS协议的常见误区有哪些?

代理协议在设备与代理服务器之间的数据交换中起到了关键作用。在这方面&#xff0c;SOCKS代理协议是常见的选择之一&#xff0c;被广泛应用于下载、传输和上传网络数据的场景。然而&#xff0c;关于SOCKS代理协议存在一些常见的误解&#xff0c;让我们来逐一了解。 一、使用SO…

爬虫逆向-js进阶(续写,搭建网站)

1.搭建简单网站1 from flask import Flask,render_template import requests import json app Flask(name)# **location**的温度是**temp**度&#xff0c;天气状况&#xff1a;**desc**app.route(/) # 绑定处理函数 def index_url():location 101010100data get_weather(lo…

Whisper 音视频转写

Whisper 音视频转写 API 接口文档 api.py import os import shutil import socket import torch import whisper from moviepy.editor import VideoFileClip import opencc from fastapi import FastAPI, File, UploadFile, Form, HTTPException, Request from fastapi.respons…

Android中的内存泄漏及其检测方式

Android中的内存泄漏及其检测方式 一、Android内存泄漏概述 在Android开发中&#xff0c;内存泄漏是一个常见且严重的问题。内存泄漏指的是在应用程序中&#xff0c;由于某些原因&#xff0c;已经不再使用的对象仍然被引用&#xff0c;导致垃圾回收器&#xff08;Garbage Col…