`

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 CAS深度分析

    JAVA CAS(Compare And Swap)是一种原子操作,用于在多线程环境中实现同步机制。CAS 通过将内存值 V、旧的预期值 A 和要修改的新值 B 进行比较,如果预期值 A 和内存值 V 相同时,将内存值 V 修改为 B,否则什么都...

    Java CAS 原理分析

    CAS(Compare and Swap)作为一种重要的同步机制,在多线程环境中发挥着关键作用。它能够帮助开发者实现无锁编程,提高程序运行效率。本文将深入剖析Java中CAS的基本原理及其背后的硬件支持机制。 #### 二、CAS基本...

    JAVA CAS实现原理与使用.docx

    Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,它提供了一种在多线程环境下更新共享变量的方式,避免了传统锁机制带来的诸多问题。在JDK 5之前,Java主要依赖`synchronized`关键字来保证线程...

    cas.tar.gz_CAS_Mutex_multithread_semphore

    CAS(Compare and Swap)是一种无锁编程中的原子操作,它在多线程环境下用于实现同步和互斥。在计算机系统中,特别是在并发编程中,CAS操作具有重要作用,因为它可以无阻塞地更新一个变量,同时避免了锁带来的开销。...

    深入分析Java并发编程之CAS

    在Java并发编程中,CAS(Compare and Swap)是一种无锁算法,用于在多线程环境中实现对共享变量的原子性更新。相比于传统的锁机制,如`synchronized`和`Lock`,CAS具有更低的开销,因为它避免了线程阻塞。本文将深入...

    全面了解Java中的CAS机制

    CAS(Compare and Swap)机制是Java中的一种乐观锁思想的应用,用于解决多线程并发访问共享资源的问题。CAS机制的核心思想是,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。...

    深入讲解我们说的CAS自旋锁到底是什么

    CAS(Compare and Swap)是实现自旋锁或乐观锁的核心操作,它的出现是为了解决原子操作的问题。在多线程环境下,原子操作是保证线程安全的重要手段。CAS操作的实现很简单,就是用一个预期的值和内存值进行比较,如果...

    不可不说的Java"锁"事1

    本文将深入探讨Java中的锁机制,包括传统的`synchronized`关键字和相对现代的`Lock`接口,以及无锁编程中的CAS(Compare And Swap)原子操作。 1. **synchronized与Lock** `synchronized`是Java早期引入的内置锁...

    Java语言中cas指令的无锁编程实现实例

    Java中的无锁编程是一种高效的并发处理技术,它利用硬件层面的CAS(Compare and Swap)指令来实现线程安全的数据更新,而无需使用传统的锁机制。CAS指令允许在不加锁的情况下,原子性地比较并替换内存位置上的值,...

    CAS原理 java 并发

    在Java并发编程中,CAS(Compare and Swap,比较并交换)是一种无锁算法,广泛应用于多线程环境下的数据同步。它通过硬件指令来实现原子操作,提升了并发性能,同时避免了锁带来的开销和死锁问题。 **一、CAS原理**...

    java面试题_多线程(68题).pdf

    在Memcached中,CAS(Compare and Swap)技术就是一种乐观锁的实现。 6. **AQS(AbstractQueuedSynchronizer)**:AQS是Java并发库中的核心组件,它是一个抽象的队列同步器,提供了构建锁和同步器的基础框架。很多...

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

    CAS(Compare And Swap)是一种无锁算法,对于JAVA程序员来说,理解并掌握它是提高程序性能的关键。CAS机制通过比较内存地址V的预期值A与实际值,并在两者相同时,将值替换为B,以此实现对变量的原子性更新,从而...

    java并发编程实战源码,java并发编程实战pdf,Java

    6. **原子操作与CAS**:AtomicInteger、AtomicLong等原子类利用了硬件级别的CAS(Compare and Swap)操作,实现了无锁编程,提高了并发性能。 7. **死锁、活锁与饥饿**:并发编程中常见的问题,需要理解和避免这些...

    java并发编程面试题分享给需要的同学.docx

    什么是自旋锁(CAS,compare and swap)? CAS存在的问题 什么是读写锁? 谈谈并发编程三要素 简述Java内存模型(JMM) volatile关键字知道么,它是怎么实现的?(难点 重要) sychronized和Lock(ReentrantLock)之间...

    Java CAS基本实现原理代码实例解析

    Java CAS(Compare And Swap,比较并交换)是 Java 中的一种并发机制,它可以实现原子性的操作。在 Java 中,CAS 是通过 java.util.concurrent.atomic 包来实现的,例如 AtomicInteger、AtomicBoolean、AtomicLong ...

    Java--CAS操作分析.txt_python怎么分析txt

    在Java并发编程中,CAS(Compare and Swap)操作是一种无锁编程技术的重要组成部分。它允许线程尝试原子地更新内存位置上的值,如果当前值与期望值相同,则更新为新值;否则不执行任何操作。CAS操作是基于硬件支持的...

    java锁详解.pdf

    1. CAS 操作:CAS(Compare And Swap)操作是用于更新共享变量的一种 atomic 操作。 2. CAS 的应用:CAS 操作可以用于解决锁竞争问题、实现原子操作等。 五、AQS 机制 1. AQS 的两种功能:AQS 机制可以提供两种...

Global site tag (gtag.js) - Google Analytics