并发编程实战 - 原子变量与非阻塞同步机制

华为IPD实战:从概念到发布的完整流程拆解(附各阶段关键文档模板) 本文深入拆解华为IPD(集成产品开发)从概念到发布的完整实战流程,涵盖概念、计划、开发验证及发布生命周期四大阶段。详细解析了各阶段的核心活动、关键产出与决策评审点,并提供了如《初始业务计划书》等关键文档模板框架,旨在帮助企业将IPD理论转化为可执行的操作指南,提升研发效率与产品成功率。 阅读详情

在java.util.concurrent包的许多类中,例如Semaphore和ConcurrentLinkedQueue,都提供了比Synchronized机制更高的性能和可伸缩性。这种性能提升的主要来源:原子变量和非阻塞的同步机制。

近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令代替锁来确保数据在并发访问中的一致性。非阻塞算法被广泛应用于在操作系统和JVM中实现线程/进程调度机制、垃圾回收机制以及锁和其他并发数据结构。

由于非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次上进行协调,并且极大的减小调度开销。而且,在非阻塞算法中不存在死锁和其他活跃性问题。从Java 5.0开始,可以使用原子变量类(例如AtomicInteger和AtomicReference)来构建高效的非阻塞算法。

即使原子变量没有用于非阻塞算法的开发,它们也可以用做一种“更好的Volatile类型变量”。原子变量提供了与Volatile类型变量相同的内存语义,此外还支持原子的更新操作,从而使它们更加适用于实现计数器、序列发生器等,同时还能比基于锁的方法提供更高的可伸缩性。

1、硬件对并发的支持

在针对多处理器操作而设计的处理器中提供了一些特殊指令,用于管理对共享数据的并发访问。在早期的处理器中支持原子的测试并设置,获取并递增以及交换等指令,这些指令足以实现各种互斥体,而这些互斥体又可以实现一些更加复杂的并发对象。现在,几乎所有的现代处理器中都包含了某种形式的原子读-改-写指令,例如比较并交换或者关联加载/条件存储。操作系统和JVM使用这些指令来实现锁和并发的数据结构。

1.1、比较并交换

在大多数处理器架构中采用的方法是实现一个比较并交换(CAS)指令。CAS包含了三个操作数 - 需要读写的内存位置V、进行比较的值A和拟写入的新值B。当且仅当V的值等于A的值时,CAS才会通过原子的方式用新值B来更新V的值,否则不执行任何操作。无论位置V的值是否等于A,都将返回V原有的值。如下是模仿CAS的示例:
public class SimulatedCAS{
private int value;
public synchronized int get(){
return value;
}
public synchronized int compareAndSwap(int expectedValue,int newValue){
int oldValue = value;
if(oldValue == expectedValue){
value = newValue;
return oldValue;
   }
  }
}
当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其他线程都将失败。然而失败的线程并不会被挂起,而是被告知在这次的竞争中失败,并可以再次尝试。由于CAS能检测到来自其他线程的干扰,因此即使不使用锁也能实现原子的读 - 改 - 写操作。

1.2、JVM对CAS的支持

Java5.0 引入了底层的支持,在int、long和对象的引用等类型上都公开了CAS操作,并且JVM把它们编译为底层硬件提供的最有效的方法。在支持CAS的平台上,运行时把它们编译为相应的(多条)机器指令。在最坏的情况下,如果不支持CAS指令,那么JVM将使用自旋锁。在原子变量类(例如java.util.concurrent.atomic中的AtomicXXX)中使用了这些底层的JVM支持为数字类型和引用类型提供了一种高效的CAS操作,而在java.util.concurrent中的大多数类在实现时则直接或间接地使用了这些原子变量类。

1.3、原子变量类

在使用基于原子变量而非锁的算法中,线程在执行时更不容易出现延迟,并且如果遇到竞争,也更容易恢复过来。原子变量类相当于一种泛化的volatile变量,能够支持原子的和有条件的读-改-写操作,在发生竞争的情况下能够提供更高的可伸缩性,因为它直接利用了硬件对并发的支持。
共有12个原子变量类,可分为4组:标量类(Scalar)、更新器类、数组类以及复合变量类。最常用的就是标量类:AtomicInteger、AtomicLong、AtomicBoolean以及AtomicReference。所有的这些类都支持CAS,此外,AtomicInteger、AtomicLong还支持算术运算。
原子数组类(只支持Integer、Long和Reference版本)中的元素可以实现原子更新。院子数组类为数组的元素提供了volatile类型的访问语义,这是普通数组不具备的特性 - volatile类型的数组仅在数组引用上具有volatile语义,而在其元素上没有。

1.4、非阻塞算法

如果在某种算法中,一个线程的失败或者挂起不会导致其他线程的失败或挂起,那么这种算法就被称为非阻塞算法。如果在算法的每一个步骤中都存在某个线程能够执行下去,那么这种算法也被称为无锁算法。如果在算法中仅将CAS用于协调线程之间的操作,并且能正确地实现,那么它既是一种无阻塞的算法,也是一种无锁的算法。

在非阻塞的算法中通常不会出现死锁和优先级反转(非公平显式锁等)问题。在许多常见的数据结构中都可以使用非阻塞算法,包括栈、队列、优先级队列以及散列表等,而要设计一些新的数据结构,最好还是由专家们来完成。

1.5、原子的域更新器

原子的域更新器类表示现有的volatile域的一种基于反射的“视图”,从而能够在已有的volatile域上使用CAS。在更新器类中没有构造函数,要创建一个更新器对象,可以调用newUpdater工厂方法,并制定类和域的名字。域更新器类没有与某个特定的实例关联在一起,因而可以更新目标类的任意实例中的域。更新器类提供的原子性保证比普通原子类更弱一些,因为无法保证底层的域不被直接修改 - compareAndSet以及其他算术方法只能确保其他使用原子域更新器方法的线程的原子性。

private class Node<T>{
private final E item;
private volatile Node<T> next;

public Node(T item){
this.item = item;
}
}

private static AtomicReferenceFieldUpdater<Node,Node> nextUpdater  = AtomicReferenceFieldUpdater.newUpdater(Node.class,Node.class,"next"
激光雷达+相机标定避坑指南:手把手教你用KITTI数据完成坐标转换 本文详细介绍了激光雷达与相机标定的实战指南,利用KITTI数据集完成精准坐标转换。从数据准备、工具链搭建到标定矩阵加载与验证,再到坐标转换流水线的工程实现,提供了全面的避坑技巧和工程实践建议。特别强调了多传感器融合中的常见问题及解决方案,帮助开发者提升自动驾驶和机器人感知系统的环境感知精度。 阅读详情

相关推荐

别再只放按钮了!巧用微信小程序‘长按识别’功能,打造无缝加群体验

本文深入探讨了微信小程序'长按识别'功能在社群运营中的创新应用,通过简化加群流程至一步操作,显著提升用户转化率。文章详细解析了技术实现细节、UI/UX设计策略,并对比了与企业微信API的适用场景,为开发者提供打造无缝加群体验的完整解决方案。

weixin_42627853的博客 434

第十五章 原子变量与非阻塞同步机制(CAS)

与基于锁的方案相比,非阻塞在设计和实现上都要复杂得多,但他们在可伸缩性和活跃性上却有着巨大优势。由于非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在颗粒度更细的层次上进行协调,并且极大地减少开销。而且,在非阻塞算法中不存在死锁和其他活跃性问题。 15.1 锁的劣势 通过使用一致的锁定协议来协调对共享状态的访问,可以确保无论哪个线程持有守护变量的锁,都能采用独占方式来访问这些变量,...

guxianghui111的博客 325

面板数据分析中的随机前沿软件FRONTIER Version 4.1应用

随机前沿模型是一种用于评估单位效率的统计方法。它考虑了输入和输出的随机性,允许我们在效率评估中引入不确定性。随机前沿模型通常用于评估生产单位、金融机构、医院等各种类型的决策单元的效率。FRONTIER是一个广泛使用的随机前沿分析软件,具有用户友好的界面和强大的功能。它提供了估计效率、前沿分析和模型比较的工具,使用户能够深入研究单位的效率和绩效。面板数据是一种包含多个单位(通常是时间序列数据)的数据类型,可以用于分析单位在不同时间点的变化和效率。

目标检测专栏持续更新中,改进YOLO系列通用,适用v5、v7、v8、所有博客均是团队原创博客,所有文章禁止转载,违者必究。 2982

原子变量与非阻塞同步机制

1.非阻塞算法被广泛用于在操作系统和JVM中实现线程/进度调度机制、垃圾回收机制以及锁和其他并发数据结构。 非阻塞算法可以使多个线程在竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次协调,并且极大地减少调度开销,非阻塞算法不存在死锁和其他活跃性问题, 原子变量类: java5.0后,使用原子变量类(例如AtomicInteger和AtomicReference)来构建高效的非阻塞算法 ...

guanlingjian的博客 166

【2021末九软工边缘人保研】川大-中科院网络中心-华师夏令营+哈工大本-中科院网络中心-西交-厦大-中山-武大-北航预推免

2021末九软工边缘人保研记录一、写在前面二、个人背景 一、写在前面 2020年计算机保研可谓是诸神黄昏,卷的头破血流(指我等菜鸡)。疫情的原因,今年的夏令营和预推免基本全部改为线上,机试取消,能不能拿到offer基本完全取决于背景以及面试表现(当然也有个别头铁非要机试,甚至笔试的学校)。大佬们offer收割不停,我等边缘人只能看着一封封拒信发呆。 这种情况下,只有985 Rank5%以及211 Rank2%之前的大佬能够较为轻松地拿到面试入场券。贴一个上交电院夏令营要求你们感受一下: 预推免相比起夏令营

weixin_43222706的博客 4235

基于Python的携程景点评价爬虫与情感评分分析

摘要: 本项目通过Python技术栈实现携程景点评论的情感分析系统,包含数据爬取、文本预处理、情感评分和可视化分析全流程。使用requests抓取评论接口,jieba进行中文分词,SnowNLP计算情感得分(0-1),并通过词云、情感分布图呈现结果。典型分析显示72%评论为正面,负面反馈多涉及"排队久""票价贵"等问题。系统可辅助景点口碑管理,扩展方向包括多景点对比、BERT模型优化等。项目强调需遵守爬虫伦理,控制请求频率,适用于非商业用途的旅游数据分析。(150字)

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 976

原子性,可见性,有序性

指的是程序执行的顺序与代码的书写顺序一致。在单线程环境下,程序的执行顺序是可预期的,但在多线程环境下,线程的执行顺序可能会受到线程的执行顺序可能会受到多种因素的影响,如指令重排序、内存模型等。在缺乏同步措施的情况下,由于线程的本地缓存以及指令重排序等原因,一个线程对共享变量的修改可能对其他线程不可见,从而导致数据不一致或程序出现错误。,原子性保证了操作的完整性,可见性保证了数据的一致性,有序性保证了程序的可预测性,在多线程编程中,需要考虑如何确保这三个方面的特性以避免出现并发问题。

Smile_CET4的博客 597

完整指南:从基础到高级使用 Semantic Kernel

通过本文的学习,你已经掌握了从基础到高级的使用方法。安装并配置。使用简单的文本生成和自然语言处理任务。利用任务链和工具扩展构建复杂的工作流。通过记忆管理上下文,创建更智能的应用。扩展多模态处理能力,集成图像和音频分析。将应用部署到云端,并通过 Azure Functions 提供智能服务。无论是构建简单的对话应用,还是创建多模态智能服务,都提供了强大的工具和灵活的扩展机制。希望这篇文章能帮助你更好地理解并运用这个框架,构建出更加智能和高效的应用。

net core ,前端 ,python 全栈开发 2805

Java并发编程实战 原子变量与非阻塞同步机制总结

锁的劣势 现代的许多JVM都对非竞争锁获取和锁释放等操作进行了极大的优化 但如果有多个线程同时请求锁 那么JVM就需要借助操作系统的功能 如果出现了这种情况 那么一些线程将被挂起并且在稍后恢复运行 当线程恢复执行时 必须等待其他线程执行完它们的时间片以后 才能被调度执行 在挂起和恢复线程等过程中存在着很大的开销 并且通常存在着较长时间的中断 如果在基于锁的类中包含有细粒度的操作(例如同步容器类 在...

勤劳的搬运工 268

如何离线环境下安装Dify插件 (可提供远程指导协助)

离线环境下安装Dify插件

litlit023的专栏 8100

【置顶】ARMv8/ARMv9架构入门到精通-[目录]

周贺贺,baron,代码改变世界,coding_the_world,Arm精选,arm_2023,安全启动,加密启动 optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表,Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、V

baron-周贺贺-代码改变世界ctw 2万+

《java并发编程实战》 第十五章 原子变量与非阻塞同步机制

《java并发编程实战笔记》第十五章 原子变量与非阻塞同步机制现有的锁的劣势比较交换指令CAS非阻塞计数器(此部分有误)原子变量是一种&amp;amp;quot;更好的volatile&amp;amp;quot;锁与原子变量的性能比较非阻塞算法(Nonblocking Algorithms) 第十五章 原子变量与非阻塞同步机制   近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法采用底层的原子机器指令,例如比较交换指令来代替锁确保数据...

乌鸦大大 547

Ubuntu上通过FinalShell或Asbru访问CentOS虚拟机

使用FinalShell或Asbru远程连接虚拟机

howard2005的专栏 2279

JAVA并发编程实战-原子变量与非阻塞同步机制

目录思维导图1 锁的劣势2 硬件对并发的支持2.1 比较并交换2.2 非阻塞计数器3 原子变量类3.1 原子变量是更佳的volatile4 非阻塞算法4.1 非阻塞栈4.2 非阻塞链表4.3 ABA问题参考文献 思维导图 1 锁的劣势 使用一致的加锁协议保障对共享状态的安全访问。 当锁的竞争频率非常高,调度和真正用于工作的开销将会非常客观。 加锁是线程安全的,但是也有缺点: 加锁导致其它线程不能做任何事情或者被挂起,性能会由于上下文切换和调度受到损失。 性能风险-优先级倒置,一个低优先级线程加锁成功

qq_36566262的博客 225

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

[Java并发编程实战] 第15章 原子变量与非阻塞同步机制

锁的劣势: 如果线程持有锁而延迟,会导致其他的线程的等待。 高优先级的线程阻塞,而低优先级的线程持有锁造成 优先级反转(priority inversion)。 如果持有锁的线程被永久地阻塞,所有等待这个锁的线程就无法执行下去,造成 死锁(dead lock)。 硬件对并发的支持 比较并交换CAS:我认为V的值应该是A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为...

Blanchedingding的博客 291

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

java并发编程实战-原子变量与非阻塞同步机制

1,近年来,在并发算法领域的大多数研究都侧重于非阻塞算法,这种算法用底层的原子机器指令(例如比较并交换指令)代替锁来确保数据在并发访问中的一致性。 2,与基于锁的方案相比,非阻塞算法在设计和实现上都要复杂得多,但它们在可伸缩性和活跃性上却拥有巨大的优势。 3,锁的劣势   3.1,当有多个线程同时请求锁时,JVM需要借助操作系统的功能,将线程挂起并且在稍后恢复运行。当锁上存在着激烈的竞争时,

乔布斯基的博客 427

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

《Java并发编程实战》第十五章 原子变量与非阻塞同步机制 读书笔记

一、锁的劣势 锁定后如果未释放,再次请求锁时会造成阻塞,多线程调度通常遇到阻塞会进行上下文切换,造成更多的开销。 在挂起与恢复线程等过程中存在着很大的开销,并且通常存在着较长时间的中断。 锁可能导致优先级反转,即使较高优先级的线程可以抢先执行,但仍然需要等待锁被释放,从而导致它的优先级会降至低优先级线程的级别。 二、硬件对并发的支持 处理器填写了一些特殊指令,例如:比较并交换

Android 2042

《Java并发编程实战》---性能与可伸缩性---原子变量与非阻塞同步机制

《Java并发编程实战》---性能与可伸缩性---原子变量与非阻塞同步机制

zhangbinalan的专栏 489

Java并发编程实战 - 第15章 原子变量与非阻塞同步机制

原子变量与非阻塞同步机制

松哥的博客 557

《JAVA并发编程实战》原子变量和非阻塞同步机制

文章目录引言锁的劣势硬件对软件的支持比较并交换非阻塞的计数器原子变量类原子变量是一种“更好的volatile”非阻塞算法非阻塞的栈非阻塞的链表ABA问题 引言 即使原子变量没有用于非阻塞算法的开发,他们也可以用作一种“更好的”volatile类型变量。原子变量提供了与volatile类型变量相同的内存语义,此外还支持原子的更新操作,从而使他们更加适用于实现计数器、序列发生器和统计数据收集等,同时还...

与望 326

《JAVA并发编程实战》 - 原子变量与非阻塞同步机制

1. 锁的劣势 2. 硬件对并发的支持 3. 原子变量类 4. 非阻塞算法

hichinamobile的博客 294

java并发编程实战-第15章-原子变量与非阻塞同步机制

java并发编程实战-第15章-原子变量与非阻塞同步机制   在高度竞争的情况下,锁的性能将超过原子变量的性能,但在其更加真实的竞争情况下,原子变量的性能将超过锁的性能     在高度竞争条件下,还得靠锁啊!     但在实际情况中,用原子变量。因为书中图15-1的竞争     主要分析15.4.2 非阻塞的链表   原子域更新器,什么时候用: 如果执行原子更新的同...

iteye_6988的博客 156

并发编程实战学习笔记(十一)-原子变量与非阻塞同步机制

原子变量在非阻塞算法的应用实现基础用底层的原子机器指令(例如比例并交换指令)代替锁来确保数据在并发访问中的一致性。缺点非阻塞算法在设计与实现上比阻塞算法都要复杂得多。优点 在可伸缩性和活跃性上拥有巨大的优势。由于非阻塞算法可以使多个线程竞争相同的数据时不会发生阻塞,因此它能在粒度更细的层次上进行协调,并且极大地减少调度开销。 不存在死锁和其它活跃性问题。 即使原子变量没有用于非阻塞算法的开发,它们也

空灵游侠 463

【读书笔记】《Java并发编程实战》第十五章 原子变量与非阻塞同步机制

原子变量与非阻塞同步机制知识梳理

GuYan的博客 467

Java并发编程实战 第15章 原子变量和非阻塞同步机制

非阻塞的同步机制 简单的说,那就是又要实现同步,又不使用锁。 与基于锁的方案相比,非阻塞算法的实现要麻烦的多,但是它的可伸缩性和活跃性上拥有巨大的优势。 实现非阻塞算法的常见方法就是使用volatile语义和原子变量。 硬件对并发的支持 原子变量的产生主要是处理器的支持,最重要的是大多数处理器架构都支持的CAS(比较并交换)指令。 模拟实现AtomicInteger的++操作 ...

weixin_30349597的博客 122

Java并发编程实战(学习笔记 十四 第十五章 原子变量与非阻塞同步机制)

原子变量与非阻塞同步机制

ahaha413525642的博客 484
上一篇: 深入理解JVM - 编译期/运行期优化
下一篇: Java 内存模型[部分概念,详细查阅书籍]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值