CAS(Compare and Swap)理解

    什么叫CAS(Compare and Swap)? java

    硬件同步原语!! 什么蛋疼的名字,通常人很难理解。根据英文全称翻译==比较与交换,这个名字大体还能理解一点,目前先暂且这么理解吧.算法

    有啥用处?
编程

    对于经常使用多线程编程的人估计知道,对于通常人估计都未曾据说。在jdk5以前,咱们知道,在多线程编程的时候,为了保证多个线程对一个对象同时进行访问时,咱们须要加同步锁synchronized,保证对象的在使用时的正确性,可是加锁的机制会致使以下几个问题多线程

    1.加多线程竞争下,加锁和释放锁会致使较多的上下文切换,引发性能问题。
性能

    2.多线程能够致使死锁的问题。
this

    3.多线程持有的锁会致使其余须要此锁的线程挂起。atom

    4......
spa

    有更好的办法么?
线程

    锁的分类:独占锁(悲观锁),乐观锁
翻译

    独占锁:synchronized就是一种独占锁,它会致使全部须要此锁的线程挂起,等待锁的释放。

    乐观锁:每次不加锁去完成操做,若是由于冲突失败就重试,直到成功。

    CAS的机制就至关于这种(非阻塞算法),CAS是由CPU硬件实现,因此执行至关快.CAS有三个操做参数:内存地址,指望值,要修改的新值,当指望值和内存当中的值进行比较不相等的时候,表示内存中的值已经被别线程改动过,这时候失败返回,当相等的时候,将内存中的值改成新的值,并返回成功。

    java 中代码实现

   在 java.util.concurrent.atomic包中能够查看源代码的实现,这里参java.util.concurrent.atomic.AtomicLong源代码,贴出核心代码:

    

    //+1操做
    public final long getAndIncrement() {
        while (true) {
            long current = get();
            long next = current + 1;
            //当+1操做成功的时候直接返回,退出此循环
            if (compareAndSet(current, next))
                return current;
        }
    }
    //调用JNI实现CAS
    public final boolean compareAndSet(long expect, long update) {
	return unsafe.compareAndSwapLong(this, valueOffset, expect, update);
    }
相关文章
相关标签/搜索