• 15. 深入理解CAS


    CAS 是什么?

    CAS (compare and swap) :: 比较并交换

    如果期望的值达到了,那么就更新,否则,就不更新,CAS 是 CPU 的并发原语

    unsafe 类

    Java 无法操作内存,但是Java 可以调用 C++, C++ 可以操作内存。unsafe 相当于 Java 的后门,可以通过这个类操作内存

        public final int getAndIncrement() {
            return unsafe.getAndAddInt(this, valueOffset, 1);
        }
    
    // CAS 是自旋锁
    public final int getAndAddInt(Object var1, long var2, int var4) {
            int var5;
            do {
                var5 = this.getIntVolatile(var1, var2);
            } while(!this.compareAndSwapInt(var1, var2, var5, var5 + var4));
    
            return var5;
        }
    

    CAS:比较当前内存中的值和主内存中的值,如果这个值是所期望的值,那么就执行操作,如果不是就一直循环

    缺点:

    1. 循环会耗时
    2. 一次性只能保证一个共享变量的原子性
    3. ABA问题

    CAS :ABA 问题
    简单来说:线程A和线程B 都操作主存中同一资源时,如果主存中变量C 原为 1;被线程A改为2之后再次改为1,此时线程是无法判断变量C有无被其他线程修改过。

  • 相关阅读:
    poj 3278 catch that cow
    POJ 1028 Web Navigation
    poj 2643 election
    hdu 1908 double queues
    hdu_2669 Romantic(扩展欧几里得)
    0/1背包 dp学习~6
    校验码
    最长上升子序列(LIS经典变型) dp学习~5
    LCS最长公共子序列~dp学习~4
    最长上升子序列(LIS) dp学习~3
  • 原文地址:https://www.cnblogs.com/blackBlog/p/13451596.html
Copyright © 2020-2023  润新知