多线程小知识

一. CAS

CAS (Compare and Swap, 比较并交换) 是一种无锁编程技术, 用于实现多线程环境下对共享资源的线程安全访问. CAS 的核心思想是: 只有当内存中的值与预期值相匹配时, 才会将内存中的值更新为新值.

寄存器1中存放原值, 寄存器2中存放新值. 现在要将内存中的原值更新为新值. CAS会先比较内存中的值和寄存器1中的值, 如果相等, 则交换内存和寄存器2中的值 (相当于把内存中的值更新).

 CAS 最核心的优点在于只通过一个CPU指令就完成了上述操作. 我们知道, 一个CPU指令, 一定是原子的, 那么就一定是线程安全的. java也基于CAS实现了许多"原子类", 这些原子类的 ++ / -- 操作都是原子的, 没有线程安全问题.

我们可以以AtomicInteger为例, 看一下其内部是怎么利用CAS实现原子操作的.

 这里的value就是内存中的数据, oldValue就是寄存器1中的数据, 表示内存中数据的原值.  CAS里对比 oldValue 和 value 是否相同, 如果相同, 就意味着在赋值操作(oldValue == value) 和比较操作之间没有其他线程插入进来 (如果不相同, 就意味着有其他线程插入进来把内存中value的值改了). 如果没有线程插入, 那么我们就可以把内存中的value更新, 如果有其他线程修改了value, 那么就把value重新赋值给oldValue. 

当然, CAS也有缺点, CAS最大的缺陷就是ABA问题, 即其他线程插入进来之后, 先把A改成B, 然后又把B改成A, 这样的话CAS就无法察觉到这样的变化. 为了解决这个问题, 又引入了"版本号", 简单理解就是A只能向B方向变, 不能向另一个方向变.
 

二. Callable接口

我们知道, run方法的修饰符是void, 即没有返回值. 所以为了解决这个问题, 我们可以使用Callable接口中的call方法. call()方法就相当于带有返回值的run()方法. Callable接口还提供了get()方法, get()相当于带有返回值的join()方法.

三. Semaphore 

Semaphore (信号量) --> 用来衡量当前可用资源的个数, 相当于一个计数器.

四. CountDownLath

一般, 当一个任务的体量很大的时候, 我们会把它拆成多个小的任务去执行. 那么如何衡量当前所与任务都执行完毕了? --> CountDownLath就能衡量出当前任务是否整体执行结束. 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

C++基础(12.红黑树实现)

目录 红黑树的概念: 红黑树规则: 红黑树如何确保最长路径不超过最短路径的2倍的? 红黑树的效率: 红黑树的插入: 红黑树树插入⼀个值的大概过程: 情况1:变色 情况2:单旋变色: 情况3&…

代码随想录算法训练营第二十天|39. 组合总和、40.组合总和II、131.分割回文串

39. 组合总和 题目链接:. - 力扣(LeetCode) 文章讲解:代码随想录 视频讲解:带你学透回溯算法-组合总和(对应「leetcode」力扣题目:39.组合总和)| 回溯法精讲!_哔哩哔哩…

机器学习基础02_特征工程

目录 一、概念 二、API 三、DictVectorize字典列表特征提取 四、CountVectorize文本特征提取 五、TF-IDF文本1特征词的重要程度特征提取 六、无量纲化预处理 1、MinMaxScaler 归一化 2、StandardScaler 标准化 七、特征降维 1、特征选择 VarianceThreshold 底方差…

得物App入选诚信案例,10万正品样品库夯实高品质消费

近日,以“加强企业诚信建设 赋能经济社会发展”为主题的“2024年全国企业诚信建设大会”在烟台市召开。此次大会由中国企业联合会、中国企业家协会主办,山东省企业联合会、山东省企业家协会、烟台市企业联合会、烟台大学承办。大会期间,得物A…

036 RabbitMQ消息确认 死信队列 延时队列

文章目录 生产者确认模式application.propertiesMessageController.javaMessageConfirmRallback.java 生产者回退模式application.propertiesMessageConfirmRallback.javaMessageController.java 消费者手动确认application.propertiesConsumerAckQueueListener.java 死信队列延…

docker desktop运行rabittmq容器,控制台无法访问

docker desktop运行rabittmq容器,控制台无法访问 启动过程:…此处缺略,网上一大堆 原因 原因是在Docker上运行的RabbitMQ,默认情况下是没有启用管理插件和管理页面的 解决办法 使用命令 docker exec -it 容器id /bin/bash 进…

Tailwind 安装使用

Tailwind 安装使用 前言 CSS原子化——本文将详细介绍如何在Vue Vite npm环境下安装、配置并使用Tailwind CSS! 文章目录 Tailwind 安装使用前言一、Tailwind 在 Vue Vite 项目中的安装1. 创建Vue项目2. 安装Tailwind CSS3. 初始化Tailwind配置4. 修改文件 tai…

centos7安装playwright踩坑记录

Python版本安装 Installation | Playwright Python 1. 安装pytest-playwright pip3 install pytest-playwright报错:提示找不到pytest-playwright 原因:服务器Python版本3.6.8太低,貌似pytest-playwright最低支持3.7 解决方法&#xff1…

函数(C语言)

1:函数的概念 函数的概念我们在初中的时候就已经听过了。 在C语言中也引入了函数,也可以叫子程序 C语言中的函数就是一个完成某项特定的任务的一小段代码 这段代码是有特殊的写法和调用方法的。其实C语言的程序也是由无数个小的函数组成的。 也就是&…

VMWare安装包及安装过程

虚拟机基本使用 检查自己是否开启虚拟化 如果虚拟化没有开启,需要自行开启:百度加上自己电脑的品牌型号,进入BIOS界面开启 什么是虚拟机 所谓的虚拟机,就是在当前计算机系统中,又开启了一个虚拟系统 这个虚拟系统&…

基于SVD奇异值分解的图像压缩算法(Python实现)

前言 SVD其实和PCA类似,就是丢入一个特征矩阵 X ,输出另外一个特征矩阵 X′ , X′ 的维度要比原来的X 要低。并且里面的变量都是原来的变量的线性组合,所以含义也变得不好解释。 简单来说就是数据压缩,特征降维的一种技术&#…

国产AI图片工具,全部免费亲测实用!

近AI生图功能火出圈了,各家大厂都拿出了看家本领,今天就来聊聊即梦AI、通义万相、奇域AI和腾讯元宝的AI生图功能,看看它们各有什么特色吧! 一、Dreamina 字节旗下的AI智能平台,简单实用的图片生成,对中国元…

C++ 二叉搜索树

二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值 若它的右子树不为空,则右子树上所有节点的值都大于根节点的值 它的左右…

推荐一款3D建模软件:Agisoft Metashape Pro

Agisoft Metashape Pro是一款强大的多视点三维建模设计辅助软件,Agisoft Metashape是一款独立的软件产品,可对数字图像进行摄影测量处理,并生成3D空间数据,用于GIS应用,文化遗产文档和视觉效果制作,以及间接…

IntelliJ+SpringBoot项目实战(四)--快速上手数据库开发

对于新手学习SpringBoot开发,可能最急迫的事情就是尽快掌握数据库的开发。目前数据库开发主要流行使用Mybatis和Mybatis Plus,不过这2个框架对于新手而言需要一定的时间掌握,如果快速上手数据库开发,可以先按照本文介绍的方式使用JdbcTemplat…

Linux高阶——1110—线程安全问题解决方法

1、同步、异步、阻塞、非阻塞 同步过程:发起调用,调用者需要等待被调用者的结果 异步过程:发起调用,无需等待被调用的结果,当有结果后,此结果传出,无需主动获取 阻塞和非阻塞:发起…

STM32cubemx+Proteus仿真和keil5联合调试

前面两步 STM32cubemx生成代码 https://blog.csdn.net/weixin_52733843/article/details/143637304 Proteus新建工程 https://blog.csdn.net/weixin_52733843/article/details/143578853 1 *Proteus仿真联合调试* 在Proteus中,双击STM32F103C6芯片&#xff0c…

初识算法 · 位运算常见总结(1)

目录 前言: 位运算基本总结 部分题目代码 前言: ​本文的主题是位运算,通过常见的知识点讲解,并且会附上5道简单的题目,5道题目的链接分别为:191. 位1的个数 - 力扣(LeetCode) 1…

visualvm远程连接Docker容器中部署的java应用并监控

visualvm远程连接Docker容器中部署的java应用 前言 jdk1.8中自带了,java11中需要单独下载 下载地址 visualvm下载地址 简介 java虚拟机监控,故障排查及性能分析工具。 网络配置 局域网与docker内网打通,请参考:办公网络与Docker内…

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM

NVIDIA RTX 系统上使用 llama.cpp 加速 LLM 文章目录 NVIDIA RTX 系统上使用 llama.cpp 加速 LLMllama.cpp 概述llama.cpp 在 NVIDIA RTX 上的加速性能使用 llama.cpp 构建的开发人员生态系统使用 llama.cpp 在 RTX 平台上加速的应用程序开始使用 适用于 Windows PC 的 NVIDIA …