并发包原子类详解

原子类型是一种无锁的、线程安全的、使用基本数据类型和引用数据类型的线程安全解决方案。

     CAS算法:CAS包含3个操作数,分别是内存值V、预期值A、要修改的新值B。当且仅当预期值A与内存值V相等时,将内存值V修改为B,否则什么都不需要做。

     借助CAS算法,并发包原子类对value的修改都是基于这种算法进行的,这种方式比synchronized、Lock等方式性能高很多。

1、AtomicInteger 详解

      AtomicInteger是Number类的一个子类,提供了很多原子性方法。在AtomicInteger内部有一个被volatile修饰的成员变量value,AtomicInteger提供的所有方法主要都是对value进行操作的,如+1、-1等。

     方法特别讲解:

      void lazySet(int newValue):在某些场景中,volatile的机制只会带来性能的拖累,这个时候使用此方法,性能比set方法高。在需要volatile内存屏障的情况下,与set方法等同。

      void set(int newValue):为value设置新值,因value被volatile修饰,可立即被其他线程看到。

2、AtomicBoolean详解

    它是一种原子性读写布尔型变量的解决方案,通常情况下,该类被用作原子性地更新状态标志位。实现方式与AtomicInteger极为类似,AtomicBoolean内部的value也是一个被volatile修饰的int类型的属性。

3、AtomicLong详解

    AtomicLong提供了原子操作Long类型数据的解决方案,是Number类的子类,提供的原子性方法在使用习惯上与AtomicInteger非常一致。AtomicLong中基于CAS算法的实现比AtomicInteger的实现要复杂,主要原因是32位、64位CPU的支持程度不同。

4、AtomicReference

    AtomicReference提供了对象引用的非阻塞原子性读写操作,并且提供了一些高级用法。AtomicReference是一个泛型类,它的构造与其他原子类型的构造一样,也提供了无参和有参的构造函数。使用无参构造函数创建AtomicReference对象时,需要再次调用set方法为对象内部的value指定初始值。

     方法特别讲解:

     compareAndSet(V expect, V update):原子性地更新AtomicReference内部的value,其中expect代表当前的值,update代表新引用值。该方法返回一个boolean结果,如果expect和AtomicReference的当前值不相等,修改失败,返回false;若修改成功返回true。

——————————————————————————————————

AtomicInteger、AtomicBoolean、AtomicLong、AtomicReference,都采用了基于volatile关键字+CAS算法无锁的操作方式确保共享数据在多线程操作下的线程安全。

volatile关键字保证了线程间的可见性。

CAS算法,对比交换算法,提供了一种快速失败的方式,当某线程修改已经被改变的数据时会快速失败。

当CAS算法对共享数据操作失败时,因有自旋算法的加持,对共享数据的操作终究会完成。 

绝大多数情况下,原子类型自旋+CAS无锁操作保证了共享变量的线程安全和原子性。

——————————————————————————————————

5、AtomicStampedReference详解

     AtomicStampedReference在构建时需要一个类似于版本号的int类型变量stamped,解决了新值、旧值一致,更新后无法确认的情况。

     compareAndSet(V expectReference, V newReference, int expectedStamp, int newStamped):与其他原子类型的CAS算法类似,如果引用当前的值、版本号与expect的值、版本号一致,则将引用更新为新的值、版本号。

6、AtomicArray详解  

    在Java的原子包中,提供了原子性操作数组元素的类,如:AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray。

    具体使用详见API

7、AtomicFieldUpdater详解

     要使共享数据的操作具备原子性,目前有两种方案:1、使用synchronized加锁;2、将对应的共享数据定义为原子类型。

      AtomicFieldUpdater提供除上述两种方案之外的第三种,原子性更新对象属性。目前并发包中有三种这样的类,分别为AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater。

      使用时需要注意:1、未被volatile修饰的成员属性无法被原子性地更新;2、类的静态变量无法被原子性地更新;3、无法直接访问的成员属性不支持原子性地更新;final修饰的成员属性无法被原子性地更新;5、父类的成员属性无法被原子性地更新

      这种方式更加节省内存,适用于第三方类库,,对类中某个属性提供原子性操作时。示例代码如下:

import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;public class AtomicTest {
static class Demo{
volatile int salary;
public int getSalary() {
return this.salary;
}
}public static void main(String[] args) {
AtomicIntegerFieldUpdater<Demo> updater=AtomicIntegerFieldUpdater.newUpdater(Demo.class, "salary");
Demo d=new Demo();
int result=updater.addAndGet(d, 10);
assert result==10;
}}

8、sun.misc.Unsafe详解

    Unsafe帮助我们直接获得某个变量的内存偏移量,获取内存地址,在其内部更是运行了汇编指令,为高并发编程提供了Lock Free方案,提高并发程序的执行效率。但是Unsafe使用不当,造成的错误是灾难性的。获取Unsafe实例需要通过反射机制进行。

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

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

相关文章

ftp传海量文件会卡?跨境数据传输推荐使用FTP吗?

企业在传输大量文件时&#xff0c;经常会遇到FTP卡顿的问题&#xff0c;尽管采取多种方式仍无法完美解决&#xff0c;尤其是在跨境数据传输方面。对于紧急项目而言&#xff0c;文件数据无法及时同步可能导致任务无法按时完成。在传输速度方面&#xff0c;甚至可能出现每秒几KB的…

免费好用的API精选推荐

快递物流订阅与推送&#xff08;含物流轨迹&#xff09;&#xff1a;【物流订阅与推送、H5物流轨迹、单号识别】支持单号的订阅与推送&#xff0c;订阅国内物流信息&#xff0c;当信息有变化时&#xff0c;推送到您的回调地址。地图轨迹支持在地图中展示包裹运输轨迹。包括顺丰…

Jmeter入门

一、下载jmeter 官网下载 下载之后解压&#xff0c;在目录/bin下面找到jmeter.bat双击之后即可启动Jmeter。 二、使用 如下左图&#xff0c;选择语言为中文&#xff0c;可以修改测试计划的名称。如下右图&#xff0c;添加线程组 添加线程组 添加http请求 路径传参方式 …

Morphisec革命:利用移动目标防御增强Windows安全性

来源&#xff1a;艾特保IT 虹科分享 | Morphisec革命&#xff1a;利用移动目标防御增强Windows安全性 原文链接&#xff1a;虹科分享 | Morphisec革命&#xff1a;利用移动目标防御增强Windows安全性 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; Windows 10安全工…

esp32cam的与安卓的udp服务视频传输

esp32cam /* 下载程序 按住接口板上的IO0 在程序上传的时候 按一下 开发板上的rst按钮 待程序开始上传 在松开 IO0 brownout detector was triggered报错 触发了断电探测器&#xff0c;估计是供电环境本来就不稳定 屏蔽 #include "soc/soc.h" #include "so…

js中分号产生的问题详解,第一次出现分号导致的问题的记录

图示: 现在 这段代码本来是两行,但是格式化后注意下面一行缩进了,代表按一行解析了, 结果: 加上分号后再格式化就自动对齐了,代表按两行解析. 要是按照没有分号进行解析是怎样的? GPT回答: 这段代码是一行 JavaScript 代码&#xff0c;涉及到了 JSON 对象、条件语句和跳转页面…

python python输入位置的坐标(即经纬度),计算两点的距离结果保留两位

以下是Python代码实现&#xff1a; from math import radians, sin, cos, sqrtdef distance(lat1, lon1, lat2, lon2):R 6371 # 地球平均半径&#xff0c;单位为公里d_lat radians(lat2 - lat1)d_lon radians(lon2 - lon1)lat1 radians(lat1)lat2 radians(lat2)a sin(d…

非法窃取、下载、打印公司商业秘密但未利用,构成犯罪吗?

公司的电子邮箱内往往存储了大量商业秘密&#xff0c;而商业秘密又是公司生存的根本。未经许可登录他人电子邮箱&#xff0c;并窃取、下载、兜售或以其他目的&#xff0c;泄露商业秘密属违法行为&#xff0c;但没有利用这些数据也构成犯罪吗&#xff1f; 案件 武汉一家技术公…

业务中台解释

业务中台是一个组织管理名词&#xff0c;也被称为有形的中台&#xff0c;因为是有实体部门存在的。业务中台多半是传统的成本中心&#xff0c;把后台的资源整合成前台打仗需要的“中间件”&#xff0c;方便被随需调用。典型的业务中台如字节跳动的直播中台、腾讯的技术中台等。…

图形化编程学习攻略:从新手到专家的指南

在编程世界中&#xff0c;图形化编程已经成为越来越多初学者的首选。它通过直观的图形化界面&#xff0c;让编程变得更加简单和有趣。6547网将为你提供一份全面的图形化编程攻略&#xff0c;帮助你从新手成为专家。 一、选择合适的图形化编程工具 Scratch&#xff1a;适合儿童…

深入理解RBAC权限系统

最近&#xff0c;一位朋友在面试中被问及如何设计一个权限系统。我们注意到目前许多后台管理系统&#xff08;包括一些热门的如若依快速开发平台&#xff09;都采用了RBAC访问控制策略。该策略通过将权限授予角色&#xff0c;然后将角色分配给用户&#xff0c;从而实现对系统资…

推荐一个FL Studio最适配的midi键盘?

Hello大家好&#xff01;好消息&#xff01;好消息&#xff01;特大好消息&#xff01; 水果党们&#xff01;终于有属于自己的专用MIDI键盘啦&#xff01; 万众期待的Novation FLKEY系列 正式出炉&#xff01; 做编曲和音乐制作的朋友们&#xff0c;对水果软件FLSTUDIO应该…

mysql开启查询日志

mysql默认不开启查询日志&#xff0c;可以通过命令查询 show VARIABLES LIKE general%; 开启查询日志&#xff0c;并更改日志存放目录&#xff0c;不过存放的目录一定要有权限不然会报错 手动创建一下log目录下的mysql目录并赋予权限 mkdir /var/log/mysql chown -R mysql:m…

在vue3的js中将一组数据赋值的问题

代码: if (res.data) { myPrizeList.value res.data console.log(myPrizeList.value,myPrizeList.value) const giftList ref() console.log(JSON.parse(JSON.stringify(myPrizeList.val…

【计算机网络】URL概念及组成

目录 一、什么是URL 二、URL格式 示例&#xff1a; 1. Scheme&#xff08;协议&#xff09;&#xff1a; 2. Host&#xff08;主机&#xff09;&#xff1a; 3. Port&#xff08;端口&#xff09;&#xff1a; 4. Path&#xff08;路径&#xff09;&#xff1a; 5. Quer…

二叉树--基础OJ

1.对称二叉树 题目链接&#xff1a;101. 对称二叉树 - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; 我们可以用递归的方法去做&#xff1a; 如果两个树互为镜像&#xff08;1.根节点的值相同&#xff0c;2.左子树的值与右子树的值对称&#xff09;则为对称二叉树&a…

SpringBoot文件下载Controller方法的几种返回值的写法与优劣

1. void 方法&#xff0c;使用 HttpServletResponse 进行文件下载&#xff1a; PostMapping("/downloadFile") public void downloadFile(HttpServletResponse response) {// 实现文件下载逻辑byte[] fileData /* 从某处获取文件数据 */;try (OutputStream outputS…

十三、C#笔记

/// <summary> /// 第二十三章&#xff1a;使用任务提高吞吐量 /// </summary> namespace Chapter23 { class Program { static void Main(string[] args) { //23.1使用并行处理执行多任务处理 /* * …

Vue--第八天

Vue3 1.优点&#xff1a; 2.创建&#xff1a; 3.文件&#xff1a; 换运行插件&#xff1a; 4.运行&#xff1a; setup函数&#xff1a; setup函数中获取不到this&#xff08;this 在定义的时候是Undefined) reactive()和ref(): 代码&#xff1a; <script setup> // …

数字孪生技术的应用场景

数字孪生技术具有广泛的应用场景&#xff0c;涉及多个行业和领域。以下是一些数字孪生的常见应用场景&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.制造业优化&#xff1a; 数字孪生可用于建模和…