zoukankan      html  css  js  c++  java
  • CAS(Compare and Swap)理解

    什么叫CAS(Compare and Swap)? 

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

        有啥用处?

        对于常用多线程编程的人估计知道,对于一般人估计都不曾听说。在jdk5之前,我们知道,在多线程编程的时候,为了保证多个线程对一个对象同时进行访问时,我们需要加同步锁synchronized,保证对象的在使用时的正确性,但是加锁的机制会导致如下几个问题

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

        2.多线程可以导致死锁的问题。

        3.多线程持有的锁会导致其他需要此锁的线程挂起。

        4......

        有更好的办法么?

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

        独占锁: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);
        }
  • 相关阅读:
    【其它】 数学是什么?
    【其它】 MathJax
    FreeCodeCamp练习笔记
    Docker容器操作中常用命令集合
    【转载】Ubuntu 系列安装 Docker
    U盘操作系统,Kali Linux操作系统安装
    网络安全&信息安全&系统安全常用名词汇总
    【CISP笔记】安全漏洞与恶意代码(2)
    【CISP笔记】安全漏洞与恶意代码(1)
    【CISP笔记】数据库及应用安全
  • 原文地址:https://www.cnblogs.com/longshiyVip/p/5205689.html
Copyright © 2011-2022 走看看