`

Java中的CAS理论 compare and swap

    博客分类:
  • java
阅读更多

Java中的CAS理论 compare and swap

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

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

原子指令由硬件提供,供软件来实现原子方法(某个线程进入该方法后,就不会被中断,直到其执行完成)

在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。

 

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来实现非阻塞算法

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

--------------------------------------------------------------------------------------------------------------------------------------

This class now works well. But locking is not a lightweight mechanismand have several disadvantages. When several threads try to acquire the same lock, one or more threads will be suspended and they will be resumed later. When the critical section is little, the overhead is really heavy especially when the lock is often acquired and there is a lot of contention. Another disadvantage is that the other threads waiting of the lock cannot do something else during waiting and if the thread who has the lock is delayed (due to a page fault or the end of the time quanta by example), the others threads cannot take their turn.

 

So how to do to avoid this disadvantages ? We must use non-blocking algorithms. This algorithms don’t use blocking mechanisms and by that fact are more scalable and performing. These algorithms use low-level machine instructionswhich are atomic to ensure the atomicity of higher-level operations. While locking is a pessimistic approach, we can alsouse optimistic techniqueto develop algorithms. This time, we’ll detect collisions between threads in which case, the operation fails and we do something else (often retrying the same operation).

 

The actual processors provide several instructions that simplify greatly the implementation of these non-blocking algorithms, the most-used operation today is the compare-and-swap operation (CAS)This operation takes three parameters, the memory address, the expected current valueand the new valueIt atomically update the value at the given memory address if the current value is the expected, otherwise it do nothing. In both cases, the operation return the value at the address after the operation execution. So when several threads try to execute the CAS operation, one thread wins and the others do nothing. So the caller can choose to retry or to do something else. We often use this operation to implement another operation, the compare-and-set. This method makes exactly the same things as CAS but return a boolean indicating if the operation succeeded or not.

 
yinhaimingyinhaiming模拟程序写的好像有问题?比较方法这样写是否更适当 compareAndSet(){return current==get()?true:false;}
2013-04-24 11:18
分享到:
评论

相关推荐

    Java中的锁分类与使用.docx

    乐观锁适用于多读的应用类型,这样可以提高吞吐量,在Java中java.util.concurrent.atomic包下面的原子变量类就是使用了乐观锁的一种实现方式CAS(Compare and Swap 比较并交换)实现的。 悲观锁:总是假设最坏的情况,...

    使用Java的Memory Model实现一个简单的计数器.txt

    `AtomicInteger`是一个支持原子操作的整数类,它内部使用了CAS(Compare And Swap)算法来实现线程安全的操作。在这个计数器中,我们使用`AtomicInteger`的`incrementAndGet()`方法来实现自增操作,并使用`get()`...

    Java hotswap demo

    Java hotswap示例。参考http://www.ibm.com/developerworks/cn/java/j-lo-hotswapcls/

    CAS原理分析

    CAS的全称是Compare And Swap 即比较交换;在计算机科学中,比较和交换(Conmpare And Swap)是用于实现多线程同步的原子指令。 它将内存位置的内容与给定值进行比较,只有在相同的情况下,将该内存位置的内容修改为...

    hotswap-for-java-file.zip

    hotswap文件夹中有三个文件 1、classes文件夹,就是把java文件编译出来的class文件存放位置 2、java文件夹,就是你要热更的java文件存放路径(热更的时候把你要热更的java文件放到里面就好) 3、history文件夹,...

    CAS底层原理与ABA问题.docx

    CAS(Compare And Swap)是一种无锁算法。CAS算法是乐观锁的一种实现。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当预期值A和内存值V相同时,将内存值V修改为B并返回true,否则返回false。

    CAS学习手册-JAVA程序员必备

    CAS是英文单词Compare And Swap的缩写,翻译过来就是比较并替换。 CAS机制当中使用了3个基本操作数:内存地址V,旧的预期值A,要修改的新值B。 更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同...

    CAS你以为你真的懂?

    CAS(Compare and swap)直译过来就是比较和替换,也有人叫compare and exchange,是一种通过硬件实现并发安全的常用技术,底层通过利用CPU的CAS指令对缓存加锁或总线加锁的方式来实现多处理器之间的原子操作。...

    今天会是有Offer的一天么:面试时不要再问我CAS和Synchronized的区别了

    CAS(Compare And Swap )是乐观锁的一种实现方式,是一种轻量级锁。JAVA1.5开始引入了CAS,JUC下很多工具类都是基于CAS。 CAS的实现方式 CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和...

    C/C++和Java达到swap不同功能

     那么在java中是否还能这样呢。非常显然java中没有地址引用符号了。  首先我们来看下c/c++和java的差别。  本质差别  C/C++中swap功能的本质:通过传递变量地址(指针或引用)来交换变量地址中的值。  Java...

    无锁数据结构 CAS Lock-free Data Structures

    CAS 比较并交换 compare-and-swap 无锁数据结构 “Lock-Free Data Structures”。 看到别人要10分资源分。我这里上传一个。有中文 + English 原文。

    swap_1位swap电路_logisim_swap_

    swap电路:当输入c=0时,输出x等于输入a,输出y等于输入b。当输入c=1时,则交换两输出,即输出y等于输入a

    swap_swap_

    swap logisim emmm 电路

    LINUX 查看进程占用swap

    用于查看LINUX下进程占用SWAP大小

    Lightweight Contention Management for Efficient Compare-and-Swap Operations-计算机科学

    Efficient Compare-and-Swap OperationsDave Dice1, Danny Hendler2 and Ilya Mirsky21 Sun Labs at Oracle 2 Ben-Gurion University of the NegevAbstract. Many concurrent data-structure implementations – ...

    Linux系统Swap交换区

    那些被释放的空间可能来自一些很长时间没有什么操作的程序,这些被释放的空间被临时保存到Swap空间 中,等到那些程序要运行时,再从Swap中恢复保存的数据到内存中。这样,系统总是在物理内存不够时,才进行Swap交换...

    修改java类不需要重启jboss的利器--hotswap安装手册

    修改java类不需要重启jboss的利器--hotswap安装手册

    Linux之如何在系统使用过程中配置SWAP分区

    Linux之如何在系统使用过程中配置SWAP分区

    增大swap分区.txt 系统安装后修改swap分区

    增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt增大swap分区.txt

    修改swap分区大小方法

    修改swap分区大小方法,如果安装完linux后感觉swap分区不够用,可以尝试此方法。

Global site tag (gtag.js) - Google Analytics