一个Java 5中最好的补充是对原子操作的支持类,如AtomicInteger,AtomicLong等。这些类帮助你减少复杂的(不必要的)多线程代码,实际上只是完成一些基本操作,如增加或减少多个线程之间的共享的值。这些类在内部依赖于一个名为CAS(Compare and Swap)的算法。在这篇文章中,我将详细讨论这个概念。

乐观悲观锁

传统的锁机制,例如在Java中使用的synchronized关键字,是多线程的悲观锁技术。它要求您首先保证没有其他线程将在某些操作之间进行干扰(即锁定对象)。

这就像是说:“请先把门关上,否则会有其他的骗子进来整理你的东西”。

虽然上面的方法是安全的,它确实有效,但它在性能上对应用程序造成了严重的影响。原因很简单,等待线程不能做任何事情,除非它们也有机会执行被保护的操作。

实际上存在一种更有效性能更好的方式,在本质上是乐观的。在这种方法中,您继续进行更新,希望您能在不受干扰的情况下完成。这种方法依赖于碰撞检测,来确定是否更新时被其他方面的干扰,在这种情况下,操作失败可以重试(或不)。

乐观的方法就像一句老话:“获得原谅比获得许可更容易”,在这里“更容易”意味着“更有效”。

Compare and Swap是这种乐观方法的一个很好例子,我们将在下面讨论。

Compare and Swap算法

该算法将某个内存位置的内容与给定值进行比较(compare),只有当它们相同时,才将内存位置的内容修改为给定的新值。这是作为单个原子操作完成的。原子性保证了新值是在最新值基础上进行计算的;如果该值已被另一个线程同时更新,那么修改会失败。操作的结果必须指明它是否执行替换(swap),这可以通过简单的布尔响应(这个变体通常称为compare-and-set),或者返回从内存位置读取的值(而不是写入它的值)来完成。

比如CAS操作有3个参数:

1、一个内存位置V,其值必须被替换。

2,上一次线程读的旧值A。

3、应在V上写的新值B。

CAS说:“我觉得V应该有值A;如果是,把B放在那里,否则不要改变它,但告诉我,我错了。”CAS乐观的希望的更新成功,同时如果另一个线程从它上次检查后更新了变量,它会检测到失败。

让我们用一个例子明白整个过程。假设V是存储值“10”的内存位置。有多个线程希望增加这个值,并将递增的值用于其他操作。让我们逐步完成整个CAS操作:

1)  初始状态。

V = 10, A = 0, B = 0

2) 现在线程1首先出现,并将V与它的上次读取的值A进行比较(compare):

V = 10, A = 10, B = 11

if A = V
V = B
else
operation failed
return V

显然,V的值将被替换(swap)为11,即操作成功。

3)然后线程2执行与线程1相同的操作,这个时候内置位置V实际上值已经是11,但线程2上次读取的还是10。

V = 11, A = 10, B = 11

if A = V
V = B
else
operation failed
return V

3) 在这种情况下,将V与它的上次读取的值A进行比较(compare),V不等于A,所以不替换值,返回V,而即当前值11。现在线程2,再次用值重试(retry)这个操作:

V = 11, A = 11, B = 12

此时,条件满足并将值递增为12,然后返回给线程2。

总之,当多个线程尝试使用CAS同时更新同一个变量时,其中一个线程会成功更新变量的值,剩下的会失败。但失败者不会受到线程的惩罚。他们可以自由地重试操作或干脆什么也不做。

这样每个线程对值得增加都是实打实的增加了,而不会导致线程1,线程2同时读取V为10,然后线程1增加为11,线程2也自认为增加了,但结果还是11,通过CAS算法避免了消失的递增,解决了明明线程2任务执行了,计数器却没计数的悲剧

这就是有关Java的原子(atomic)操作简单但重要的概念。

Happy Learning !!

Compare and Swap [CAS] 算法的更多相关文章

  1. Compare and Swap(CAS)

    CAS(Compare and Swap)是个原子操作.拿到一个新值后,CAS将其与内存中的值进行比较,若内存中的值和这个值不一样,则将这个值写入内存,否则,不做操作.在Java的 java.util ...

  2. 非阻塞同步算法与CAS(Compare and Swap)无锁算法

    锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...

  3. 【Java并发编程】9、非阻塞同步算法与CAS(Compare and Swap)无锁算法

    转自:http://www.cnblogs.com/Mainz/p/3546347.html?utm_source=tuicool&utm_medium=referral 锁(lock)的代价 ...

  4. CAS(Compare and Swap)无锁算法-学习笔记

    非阻塞同步算法与CAS(Compare and Swap)无锁算法 这篇问题对java的CAS讲的非常透彻! 锁的代价 1. 内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的 ...

  5. CAS(Compare and Swap)理解

    什么叫CAS(Compare and Swap)?  硬件同步原语!! 什么蛋疼的名字,一般人很难理解.根据英文全称翻译==比较与交换,这个名字大致还能理解一点,目前先暂且这么理解吧. 有啥用处? 对 ...

  6. 无锁机制----比较交换CAS Compare And Swap

    一.锁与共享变量 加锁是一种悲观的策略,它总是认为每次访问共享资源的时候,总会发生冲突,所以宁愿牺牲性能(时间)来保证数据安全. 无锁是一种乐观的策略,它假设线程访问共享资源不会发生冲突,所以不需要加 ...

  7. 面试:为了进阿里,又把并发CAS(Compare and Swap)实现重新精读一遍

    该系列文章已收录在公众号[Ccww技术博客],原创技术文章第一时间推出 前言 在面试中,并发线程安全提问必然是不会缺少的,那基础的CAS原理也必须了解,这样在面试中才能加分,那来看看面试可能会问那些问 ...

  8. Java并发基础之Compare And Swap/Set(CAS)

    什么是 CAS?CAS(Compare And Swap/Set)比较并交换, CAS 算法的过程是这样:它包含 3 个参数CAS(V,E,N). V 表示待更新的变量(内存值), E 表示预期值(旧 ...

  9. Java多线程和并发(十一),CAS(Compare and Swap)

    目录 1.CAS简介 2.CAS多数情况下对开发者来说是透明的 3.CAS缺点 十一.CAS(Compare and Swap) Synchronized直观意义上是一种悲观锁 cas则是乐观锁的一种 ...

随机推荐

  1. cas 代理认证配置

    注:本文转自http://www.ichatter.net/2013/03/21/385/ CAS(Central Authentication Service)框架是一个开源的单点登陆框架.最近公司 ...

  2. linux用户和组的创建与管理!

    useradd创建用户,usermod修改用户属性,userdel删除用户,groupadd创建组,groupmod修改组属性,groupdel删除组. 创建用户命令:useradd 语法: user ...

  3. Nuget常用命令操作

    Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中添加.移除和更新引 ...

  4. WPF 简易手风琴 (ListBox+Expander)

    概述 之前听说很多大神的成长之路,几乎都有个习惯--写博文,可以有效的对项目进行总结.从而提高开发的经验.所以初学WPF的我想试试,顺便提高一下小学作文的能力.O(∩_∩)O哈哈~ 读万卷书不如行万里 ...

  5. 拖拽系列二、利用JS面向对象OOP思想实现拖拽封装

    接着上一篇拖拽系列一.JavaScript实现简单的拖拽效果这一篇博客将接着对上一节实现代码利用JS面向对象(OOP)思维对上一节代码进行封装; 使其模块化.避免全局函数污染.方便后期维护和调用:写到 ...

  6. Mongodb安装启动详解

    最近在倒腾node+mongodb,安装mongodb的时候开始遇到很多问题,然后折腾了好几次,直到可以很顺利完成安装 ,所以把安装的过程记录下来. 线上系统基本上都是linux的,所以只安装了lin ...

  7. ar1220f-s四条拨号光纤做的策略路由实现负载均衡

    acl number 3001  //内网数据流不需被重定向到外网出口. rule 5 permit ip source 192.168.0.0 0.0.255.255  destination 19 ...

  8. Java实现的高效计数器

    本文转载地址:            http://blog.csdn.net/snarlfuture/article/details/17049731 在统计来自数据库或文本中某些内容的频率时,你可 ...

  9. cocoapods安装和使用常见问题及解决方案

    cocopods安装后pod install出现以下错误 /usr/local/Cellar/ruby/2.4.1_1/lib/ruby/2.4.0/rubygems.rb:270:in find_s ...

  10. Web攻防系列教程之跨站脚本攻击和防范技巧详解

    摘要:XSS跨站脚本攻击一直都被认为是客户端Web安全中最主流的攻击方式.因为Web环境的复杂性以及XSS跨站脚本攻击的多变性,使得该类型攻击很 难彻底解决.那么,XSS跨站脚本攻击具体攻击行为是什么 ...