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

CAS无锁算法

要实现无锁(lock-free)的非阻塞算法有多种实现方法,其中CAS(比较与交换,Compare and swap)是一种有名的无锁算法。CAS, CPU指令,在大多数处理器架构,包括IA32、Space中采用的都是CAS指令,CAS的语义是“我认为V的值应该为A,如果是,那么将V的值更新为B,否则不修改并告诉V的值实际为多少”,CAS是项乐观锁技术,当多个线程尝试使用CAS同时更新同一个变量时,只有其中一个线程能更新变量的值,而其它线程都失败,失败的线程并不会被挂起,而是被告知这次竞争中失败,并可以再次尝试。CAS有3个操作数,内存值V,旧的预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。CAS无锁算法的java实现如下:

public synchronized int compareAndSwap(int expect, int newValue) {
        int old = this.a;
        if (old == expect) {
            this.a = newValue;
        }
        return old;
    }

CAS无锁算法的C实现如下:

int compare_and_swap (int* reg, int oldval, int newval)
{
  ATOMIC();
  int old_reg_val = *reg;
  if (old_reg_val == oldval)
     *reg = newval;
  END_ATOMIC();
  return old_reg_val;
}

详细的转自:http://www.cnblogs.com/Mainz/p/3546347.html

http://www.2cto.com/kf/201312/261150.html

时间: 2024-10-25 04:12:49

非阻塞同步算法与CAS(Compare and Swap)无锁算法的相关文章

CAS(Compare And Swap)分析

CAS(Compare And Swap)指的是现代CPU广泛支持的一种对内存中的共享数据进行操作的一种特殊指令.这个指令会对内存中的共享数据做原子的读写操作. 简单介绍一下这个指令的操作过程:首先,CPU会将内存中将要被更改的数据与期望的值做比较.当这两个值相等时,CPU才会将内存中的数值替换为新的值,否则便不做操作.最后,CPU 会将当前变量的真实值返回.这一系列的操作是原子的. CAS是一种乐观锁的思路,它相信在它修改之前,没有其它线程去修改它.而synchronized是一种悲观锁,它认

非阻塞同步算法实战(四)- 计数器定时持久化

问题背景及要求 需要对评论进行点赞次数和被评论次数进行统计,或者更多维度 要求高并发.高性能计数,允许极端情况丢失一些统计次数,例如宕机 评论很多,不能为每一个评论都一直保留其计数器,计数器需要有回收机制 问题抽象及分析 根据以上需求,为了方便编码与测试,我们把需求转化为以下接口 /** * 计数器 */ public interface Counter { /** * 取出统计数据,用Saver去持久化(仅定时器会调用,无并发) * @param saver */ void save(Save

无锁算法CAS 概述

无锁算法CAS 概述 JDK5.0以后的版本都引入了高级并发特性,大多数的特性在java.util.concurrent包中,是专门用于多线并发编程的,充分利用了现代多处理器和多核心系统的功能以编写大规模并发应用程序.主要包含原子量.并发集合.同步器.可重入锁,并对线程池的构造提供了强力的支持. 原子量是定义了支持对单一变量执行原子操作的类.所有类都有get和set方法,工作方法和对volatile变量的读取和写入一样.并发集合是原有集合框架的补充,为多线程并发程序提供了支持.主要有:Block

具体CAS操作实现(无锁算法)

具体CAS操作 上一篇讲述了CAS机制,这篇讲解CAS具体操作. 什么是悲观锁.乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了. synchronized是悲观锁,这种线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁. CAS操作的就是乐观锁,每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止. 那么问题来了,什么是CAS操作? CAS是Comp

CAS(Compare and Swap)理解

什么叫CAS(Compare and Swap)?  硬件同步原语!! 什么蛋疼的名字,一般人很难理解.根据英文全称翻译==比较与交换,这个名字大致还能理解一点,目前先暂且这么理解吧. 有啥用处? 对于常用多线程编程的人估计知道,对于一般人估计都不曾听说.在jdk5之前,我们知道,在多线程编程的时候,为了保证多个线程对一个对象同时进行访问时,我们需要加同步锁synchronized,保证对象的在使用时的正确性,但是加锁的机制会导致如下几个问题 1.加多线程竞争下,加锁和释放锁会导致较多的上下文切

CAS原子锁 高效自旋无锁的正确用法

1 #pragma once 2 #ifndef _atomic_lock_h_include_ 3 #define _atomic_lock_h_include_ 4 5 #include <windows.h> 6 7 #define cpu_pause() __asm {pause} 8 #define thread_yield() Yield() 9 10 #define spin_num (2048) 11 12 typedef struct { 13 volatile long l

CAS(Compare And Swap)

之前的文章讲了ReentrantLock和synchronized都是通过锁来保证线程安全的,锁机制存在一些问题,例如: ? 在多线程的竞争下,加锁.释放锁会导致很多线程的上下文切换和调度,对性能有一定的影响: ? 一个线程持有锁会导致其他需要此锁的线程挂起(强行在锁的区域将并行变为串行): ? 使用不当还会导致死锁.饥饿.活锁等: 也许你会说,也可以用volatile,volatile是轻量级的锁,但是不能保证原子性,所以最后还是会回到锁的机制上来: synchronized和Reentran

非阻塞算法-简单的计数器

1.为什么要用非阻塞算法?我们知道为了避免并发环境下操作共享变量的问题,可以采用同步(synchronize)和锁(Lock)的方式做到线程安全,但是JVM处理锁竞争时对于竞争失败的线程采用的是挂起稍后调度的策略,这样会带来额外的线程上下文切换成本.同时和CAS(Compare And Set)这种非阻塞算法相比,CAS是在底层硬件(CPU)层面实现,只需要锁定独立的内存位置,更细的同步粒度使得CAS失败的线程可以立即重试而不用挂起.总的来说,大多数场景下非阻塞算法和同步锁相比能带来更好的性能,

《Java并发编程实战》笔记-非阻塞算法

如果在某种算法中,一个线程的失败或挂起不会导致其他线程也失败和挂起,那么这种算法就被称为非阻塞算法.如果在算法的每个步骤中都存在某个线程能够执行下去,那么这种算法也被称为无锁(Lock-Free)算法.如果在算法中仅将CAS用于协调线程之间的操作,并且能正确地实现,那么它既是一种无阻塞算法,又是一种无锁算法. 创建非阻塞算法的关键在于,找出如何将原子修改的范围缩小到单个变量上,同时还要维护数据的一致性. 非阻塞算法的所有特性:某项工作的完成具有不确定性,必须重新执行.