首页 > 编程语言 >Java的多线程编程模型5--Java中的CAS理论

Java的多线程编程模型5--Java中的CAS理论

时间:2023-04-25 11:06:15浏览次数:39  
标签:Java -- next current CAS int 线程 java 多线程


CAS,compare and swap的缩写,中文翻译成比较并交换。

我们都知道,在java语言之前,并发就已经广泛存在并在服务器领域得到了大量的应用。所以硬件厂商老早就在芯片中加入了大量直至并发操作的原语,从而在硬件层面提升效率。在intel的CPU中,使用cmpxchg指令。

在Java发展初期,java语言是不能够利用硬件提供的这些便利来提升系统的性能的。而随着java不断的发展,Java本地方法(JNI)的出现,使得java程序越过JVM直接调用本地方法提供了一种便捷的方式,因而java在并发的手段上也多了起来。而在Doug Lea提供的cucurenct包中,CAS理论是它实现整个java包的基石。

1. CAS:

CAS 操作包含三个操作数 —— 内存位置(V)、预期原值(A)和新值(B)。 如果内存位置的值与预期原值相匹配,那么处理器会自动将该位置值更新为新值 。否则,处理器不做任何操作。无论哪种情况,它都会在 CAS 指令之前返回该 位置的值。(在 CAS 的一些特殊情况下将仅返回 CAS 是否成功,而不提取当前 值。)CAS 有效地说明了“我认为位置 V 应该包含值 A;如果包含该值,则将 B 放到这个位置;否则,不要更改该位置,只告诉我这个位置现在的值即可。”

通常将 CAS 用于同步的方式是从地址 V 读取值 A,执行多步计算来获得新 值 B,然后使用 CAS 将 V 的值从 A 改为 B。如果 V 处的值尚未同时更改,则 CAS 操作成功。

类似于 CAS 的指令允许算法执行读-修改-写操作,而无需害怕其他线程同时 修改变量,因为如果其他线程修改变量,那么 CAS 会检测它(并失败),算法 可以对该操作重新计算。

2.非阻塞算法

如果每个线程在其他线程任意延迟(或甚至失败)时都将持续进行操作,就可以说该算法是无等待的。与此形成对比的是,无锁定算法要求仅 某个线程 总是执行操作。(无等待的另一种定义是保证每个线程在其有限的步骤中正确计 算自己的操作,而不管其他线程的操作、计时、交叉或速度。

3.用CAS来实现非阻塞算法

 



1. package zl.study.concurrency;  
2. /**
3.  * AtomicInteger的模拟类,主要是用来测试CAS和非阻塞方式加锁
4.  * @author peter
5.  *
6.  */  
7. public class SimulatedAtomicInteger {  
8. private int value= 0;  
9.       
10. private int get(){  
11. return this.value;  
12.     }  
13. /**
14.      * 模拟CAS
15.      * @param current
16.      * @param next
17.      * @return
18.      */  
19. private synchronized boolean compareAndSet(int current,int next){  
20. return current == next?true:false;  
21.     }  
22. /**
23.      * 模拟非阻塞算法
24.      * @return
25.      */  
26. public final int incrementAndGet() {  
27. for (;;) {  
28. int current = get();  
29. int next = current + 1;  
30. if (compareAndSet(current, next))   
31. return next;  
32.         }  
33.     }  
34. }



 

需要注意的是这个方法中的CAS是在jav代码实现的,这个并没有包含内存位置。在concurrent包中,是JNI的方式,内存位置也作为参数传入这个JNI方法中,在后面碰到了在做详细的介绍

在后面介绍java 5提供的并发工具时,我们还能经常看到类似于SimulatedAtomicInteger得写法,大家可以好好体会!

 

标签:Java,--,next,current,CAS,int,线程,java,多线程
From: https://blog.51cto.com/u_16087105/6223576

相关文章

  • 微信公众号使用隐藏页判断登录
    <scripttype="text/javascript">   $(document).ready(function(){      document.getElementById("over").style.display="block";      document.getElementById("layout").style.display="block";      //判断......
  • Echarts4.0 迁徙图模拟Echarts2.0样式
     由于公司业务需求做Echarts4.0的迁徙图,但是Echarts4.0默认的迁徙图的飞行轨迹和迁徙线的颜色都是一样的,比较单调,现在模拟Echarts2.0的样式模拟了一个demo,虽然没有全部相同,但大体相近。备忘一下letminigrateChart=echarts.init(document.getElementById("MinigrateChart"));......
  • nginx解决Ajax跨域问题
    今天遇到一个ajax跨域问题,下拉框的数据源要从一个接口获得,但是该接口被部署到另外一台服务器上,在本地可以通过http请求访问,并可以返回json的数据,但是放到页面中不可以获取到下拉框的值,发现chrome控制台中该请求成功,但是没有返回值,于是便遇到了跨域的问题,请教一同事,问题得到解决:1.搭......
  • ansible自动化运维
    修改ansible服务器端hosts文件将hosts文件复制到两台客户端切换到ansible光盘挂载光盘删除系统自带源安装ansible服务器端检查版本配置ansible客户端生成密钥对上传公钥到客户端centos02和centos03上登录面交互式验证远程创建目录benet查看创建的目录查看客户端磁盘空间查看客户端s......
  • JAVA设计模式学习10——组合模式
    组合模式(Composite)就是把部分和整体的关系用树形的结构来表示,从而使客户端能够把部分对象和组合起来的对象采用同样的方式来看待。树图结构一般包含一个根节点,若干个树枝和叶子节点。如下图:树结构的类图,其实就是组合模式的简略类图,最上面为抽象节点,左下方为叶子节点,右下方为树......
  • 台湾服务器的优缺点是什么?
    简述台湾服务器与其他亚州服务器有什么区别?为什么香港服务器无法取代台湾服务器?什么业务的人适合使用台湾服务器吗?文章内会情况给大家说明什么是台湾服务器?台湾服务器就是建基于台湾地区的服务器,网络也是采用台湾网络供应商,本地网络供应商对中国网络稳定性很差,到晚上就正......
  • 流量即生意!红海中的茶饮品牌如何做增量?
    新消费潮流走红,茶饮赛道的蓝海阶段早已过去,随之而来的是越来越卷的行业大战,「喜茶」和「奈雪の茶」已经完成市场的攻城掠地,形成寡头垄断高端茶饮市场的局面。与此同时,中低端茶饮赛道上,“抢位战”也愈演愈烈。千亿级别的茶饮赛道,会诞生多少个品牌?一切都是未知数,但似乎能给老板们带来......
  • C++STL学习经典
    C++语言学习之STL的组成STL有三大核心部分:容器(Container)、算法(Algorithms)、迭代器(Iterator),容器适配器(containeradaptor),函数对象(functor),除此之外还有STL其他标准组件。通俗的讲:容器:装东西的东西,装水的杯子,装咸水的大海,装人的教室……STL里的容器是可容纳一些数据的模板类。算法:......
  • 智能燃气物联网数据采集解决方案
    工业物联网技术应用于燃气管理可以实现自动化数据采集和远程监控报警,为企业提供查询燃气消耗量的可靠手段,实现燃气能耗智能管理,提升管理效率,有助于节能减排工作开展。通过将燃气表接入到物通博联工业智能网关,实现能耗数据的共享,将实时计量数据上报到监控中心(本地上位机或云平台),实现......
  • mysql记录耗时的sql
    author:skatetime:2012/02/17mysql记录耗时的sqlmysql可以把耗时的sql或未使用索引的sql都记录在slowlog里,供优化分析使用。1.mysql慢查询日志启用:mysql慢查询日志对于跟踪有问题的查询非常有用,可以分析出当前程序里有很耗费资源的sql语句,那如何打开mysql的慢查询日志记录呢?mysql......