CAS和多线程密切相关的东西!

简介: CAS和多线程密切相关的东西!

compare  and  swap:寄存器A的值和内存M的值进行比较,如果值相同,就把寄存器B和M的值进行交换

更多的时候,不关心寄存器中的数量是啥,更关心内存的数值(变量的值)

CAS相当于是把开了新世界的大门,让咱们不加锁就能保证线程安全!!

基于CAS可以实现很多操作:

  • 实现原子类:标准库里提供了AtomInteger类,能够保证++,--的时候线程安全!

基于CAS实现两个线程各自自增5W次

import java.util.concurrent.atomic.AtomicInteger;
public class Main1 {
    //基于CAS实现两个线程各自自增5W次
    public static void main(String[] args) throws  InterruptedException{
        AtomicInteger num=new AtomicInteger(0);
        //初始化为0
        //线程1
        Thread t1=new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                //num++  后置++
                num.getAndIncrement();
                //++num 前置++
                //num.incrementAndGet();前置--
                // num.getAndDecrement();后置--
            }
        });
        //线程2
        Thread t2=new Thread(()->{
            for (int i = 0; i < 50000; i++) {
                num.getAndIncrement();
                //后置++
            }
        });
        t1.start();
        t2.start();
        //阻塞等待
        t1.join();
        t2.join();
        //get获取到数值
        System.out.println(num.get());//100000
    }
}

上述代码的运行结果为:

  • 实现自旋锁

反复检查当前的锁状态,看是否解开了

实现自旋目的就是为了忙等,就是为了能够最快速的拿到锁!!

CAS还能做其他的很多事,在此便不再展开!!

CAS的aba问题:面试中的经典问题!!

CAS关键是对比内存和寄存器的值,看看是否相同(就是通过这个对比来检测内存是否变过),万一对比的时候是相同的,但是不是没变过,而是a->b->a??此时有一定的概率会出现!!

CAS只能对比值是否相同,不能确定这个值是否中间发生过变化!!(这个事情大部分情况下都没事,但是小部分情况下会出现Bug!!)

如何解决aba问题??

aba关键是值反复横跳(a->b->a),如果约定数据只能单方向变化,那么,问题就迎刃而解了!!(只能增加/只能减少)

但是若需求要求某数值,既能增加又能减少,咋办??

可以引入另外一个版本号变量,约定版本号只能增加(每次修改,都会增加一个版本号)

只要约定版本号,只能递增,就能保持此时不会出现aba反复横跳问题!!以版本号为基准,而不是变量数量为基准了!!

相关文章
|
9月前
|
Java 编译器
解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略
解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略
|
9月前
|
Java 索引
多线程和并发编程(2)—CAS和Atomic实现的非阻塞同步
多线程和并发编程(2)—CAS和Atomic实现的非阻塞同步
52 1
多线程和并发编程(2)—CAS和Atomic实现的非阻塞同步
|
6天前
|
算法 安全 Java
Java多线程基础-12:详解CAS算法
CAS(Compare and Swap)算法是一种无锁同步原语,用于在多线程环境中更新内存位置的值。
16 0
|
19天前
|
存储 安全 Java
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
并发编程知识点(volatile、JMM、锁、CAS、阻塞队列、线程池、死锁)
77 3
|
6天前
|
安全 Java 编译器
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
|
6天前
|
安全 Java
多线程(CAS, ABA问题, Runnable & Callable & 僵尸线程 & 孤儿进程)
多线程(CAS, ABA问题, Runnable & Callable & 僵尸线程 & 孤儿进程)
15 1
|
19天前
|
安全 Java 程序员
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
【Java多线程】面试常考——锁策略、synchronized的锁升级优化过程以及CAS(Compare and swap)
16 0
|
19天前
|
安全 Java API
JavaEE多线程】深入理解CAS操作:无锁编程的核心
JavaEE多线程】深入理解CAS操作:无锁编程的核心
21 0
|
19天前
|
存储 安全 Java
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(下)
多线程编程常见面试题讲解(锁策略,CAS策略,synchronized原理,JUC组件,集合类)(下)
45 0