`

无锁(CAS)编程

 
阅读更多

 1.  无 锁类 的原理 详 解

1.1.CAS

       CAS算法的过程是这样:它包含3个参数CAS(V,E,N)。V表示要更新的变量,E表示预期值,N表示新值。仅当V值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么都不做。最后,CAS返回当前V的真实值。CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成操作。当多个线程同时使用CAS操作一个变量时,只有一个会胜出,并成功更新,其余均会失败。失败的线程不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。基于这样的原理,CAS操作即时没有锁,也可以发现其他线程对当前线程的干扰,并进行恰当的处理。

1.2.CPU 指令

    CAS操作是在一条cpu指令中完成。具有原子性,线程安全

cmpxchg
/*
accumulator = AL, AX, or EAX, depending on whether
a byte, word, or doubleword comparison is being performed
*/
if(accumulator == Destination) {
ZF = 1;
Destination = Source;
}
else {
ZF = 0;
accumulator = Destination;
}

 

2.  无 锁类 

2.1AtomicInteger

AtomicInteger和Integer一样,都继承与Number类

public class AtomicInteger extends Number implements java.io.Serializable

 AtomicInteger里面有很多CAS操作,典型的有:

public final boolean compareAndSet(int expect, int update) {
        return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
    }

 这里来解释一下unsafe.compareAndSwapInt方法,他的意思是,对于this这个类上的偏移量为valueOffset的变量值如果与期望值expect相同,那么把这个变量的值设为update。

其实偏移量为valueOffset的变量就是value

static {
      try {
        valueOffset = unsafe.objectFieldOffset
            (AtomicInteger.class.getDeclaredField("value"));
      } catch (Exception ex) { throw new Error(ex); }
}

 

我们此前说过,CAS是有可能会失败的,但是失败的代价是很小的,所以一般的实现都是在一个无限循环体内,直到成功为止。

public final int getAndIncrement() {
        for (;;) {
            int current = get();
            int next = current + 1;
            if (compareAndSet(current, next))
                return current;
        }
    }

Unsafe类中使用

从类名就可知,Unsafe操作是非安全的操作,比如:

  • 根据偏移量设置值(在刚刚介绍的AtomicInteger中已经看到了这个功能
  • park()(把这个线程停下来,在以后的Blog中会提到)
  • 底层的CAS操作

非公开API,在不同版本的JDK中,可能有较大差异

 

2.2 AtomicReference(模板类)、AtomicStampedReference、AtomicIntegerArray(无锁数组)不一一列举

2.3 AtomicIntegerFieldUpdater(普通变量也享受原子)

2.3.1. 概述

让普通变量也享受原子操作

2.3.2. 主要接口

AtomicIntegerFieldUpdater.newUpdater()

incrementAndGet()

2.3.3. 小 说 明

1.Updater只能修改它可见范围内的变量。因为Updater使用反射得到这个变量。如果变量不可见,就会出错。

比如如果score申明为private,就是不可行的。

2.为了确保变量被正确的读取,它必须是volatile类型的。如果我们原有代码中未申明这个类型,那么简单得

申明一下就行,这不会引起什么问题。

3.  由于CAS操作会通过对象实例中的偏移量直接进行赋值,因此,它不支持static字段(Unsafe.

objectFieldOffset()不支持静态变量)。

 

分享到:
评论

相关推荐

    无锁化编程

    综上所述,无锁化编程涉及多种技术和策略,包括非阻塞、非饥饿、非等待、非锁定等概念,以及CAS操作、内存屏障等关键技术。通过对这些概念和技术的理解与应用,开发者能够在多线程环境中构建高性能、低延迟的并发...

    透过 Linux 内核看无锁编程

    ### 透过 Linux 内核看无锁编程 随着计算硬件的发展,多核多线程处理器逐渐成为主流配置,这也使得并行程序设计变得越来越重要。并行编程的关键问题之一是如何有效地管理和保护共享资源,避免并发操作导致的数据不...

    Linux无锁编程.pdf

    CAS())CAScommit-retry模式是无锁编程中常用的一种技术,它不断尝试执行CAS操作,直到成功为止。 3. Linux 2.6.10及以上版本的内核支持SMP(对称多处理)锁,提供了一些无锁同步机制,例如seqlock、RCU(Read-Copy ...

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

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

    基于cas的无锁队列实现

    无锁队列是一种在多线程环境下实现高效并发操作的数据结构。...然而,无锁编程也增加了实现的复杂性,需要对并发原理有深入理解。在实际应用中,开发者需要权衡锁和无锁算法的利弊,选择最适合场景的解决方案。

    无锁编程简介

    ### 无锁编程简介 #### 一、无锁编程概述 无锁编程是一种高级的并发控制技术,旨在通过消除传统锁机制(如互斥锁、信号量等)来提高多线程或多进程程序的性能与可伸缩性。在多核架构日益普及的背景下,无锁编程...

    Linux无锁编程终稿.pdf

    《Linux无锁编程终稿》深入探讨了在多核多线程环境下,如何通过无锁编程技术实现高效、安全的并行处理。无锁编程是并行计算领域中的一种先进方法,它避免了传统锁机制可能导致的死锁、活锁和优先级反转等问题,提升...

    一个无锁算法的库实现

    无锁算法,也被称为锁-free或原子操作算法,是一种并发编程技术,旨在提高多线程环境中的性能。在传统的同步机制中,如互斥锁,线程必须竞争资源,这可能导致上下文切换和死锁等问题。无锁算法通过避免锁的使用来...

    无锁编程之自旋锁的C++实现

    无锁编程是一种高级的并发控制技术,它避免了在多线程环境中使用传统的互斥量或信号量等机制带来的上下文切换开销。在无锁编程中,自旋锁是核心概念之一,它用于保护共享资源,使得在等待资源释放时,线程不会被挂起...

    锁与原子操作CAS以及无锁队列的底层实现相关资源

    CAS(Compare and Swap,比较并交换)是一种无锁编程的重要原语,而无锁队列则是利用这些原语构建高效并发数据结构的典范。下面我们将深入探讨这些概念及其在实际应用中的底层实现。 首先,我们来看“锁”。在多...

    一个c++11实现的无锁队列.zip

    1. **无锁编程**:无锁编程是一种并发编程技术,它避免了线程间的竞争条件和死锁问题,通过原子操作保证数据的一致性。在无锁队列中,数据的读写操作不需要加锁,而是依赖于原子操作的不可分割性。 2. **C++11的...

    乐观锁的一种实现方式-CAS编程开发技术共4页.pdf

    总的来说,CAS编程开发技术是一种高效且无锁的并发控制手段,它在多线程环境下能够帮助我们构建高性能的系统。但同时,理解和合理使用CAS,以及妥善处理可能出现的问题,是每个Java并发程序员的必备技能。通过深入...

    Java并发——无锁实现

    在Java并发编程中,无锁实现是一个高级技术,它可以让多个线程在没有使用传统锁机制(如synchronized关键字或显示锁Lock)的情况下,安全地执行对共享资源的操作。无锁机制主要依赖于硬件的原子指令,尤其是比较并...

    无锁数据结构

    - **无锁栈**:一种常见的无锁数据结构,使用CAS操作来实现线程安全的入栈和出栈操作。 - **无锁队列**:通过CAS操作实现线程安全的入队和出队操作,保证队列在高并发下的正确性和性能。 #### 六、未来发展趋势 ...

    Java很好的学习笔记4 无锁.md,学习代码

    在Java编程领域,无锁编程是一种高级的并发控制技术,旨在提高多线程环境下的程序性能和可伸缩性。本笔记将深入探讨无锁编程的概念、原理以及在Java中的实现方式。 首先,理解无锁编程的核心思想是关键。无锁编程,...

    ITDSD-5.用于微服务拆分的无锁编程

    无锁编程是一种优化分布式系统和微服务架构性能的技术,它主要应用于多线程环境,以减少并发访问时的锁竞争,提高系统的并行处理能力。在微服务架构中,每个服务可能独立运行在不同的节点上,因此高效且低冲突的通信...

    Lockfree论文集合,若干无锁数据结构实现的经典论文,500多页.zip

    1. 原子操作:如CAS(Compare-and-Swap)或LL/SC(Load-Link/Store-Conditional)等,它们是无锁编程的基础。这些原语可以在单个操作中读取和更新数据,并保证其原子性,即不会被其他线程打断。 2. ABA问题:无锁...

    无锁队列

    无锁队列是一种高效、线程安全的数据结构,它在多线程环境下广泛应用于高性能并发编程,例如在Java中,著名的Disruptor框架就利用了无锁队列的设计。无锁队列的核心思想是利用原子操作(如CAS,Compare and Swap)来...

    Lock free 论文集合,若干无锁数据结构实现的经典论文,500多页.zip

    1. **原子操作与内存模型**:无锁编程依赖于原子操作(如CAS - Compare and Swap),这些操作在硬件级别上是不可分割的,能确保在并发环境下的一致性。内存模型定义了如何处理并发访问和可见性问题,例如,Java的...

    无锁队列英文论文(具有研究价值).zip

    - **比较与交换(CAS)**:CAS操作是无锁编程的基础,它比较并替换内存中的值,如果当前值与预期值相同,则更新为新值;否则,不做任何修改。 论文可能会探讨不同无锁队列算法的优缺点,如Michael-Scott队列、...

Global site tag (gtag.js) - Google Analytics