java模拟实现CAS

简介: java模拟实现CAS

  CAS是 "比较和交换 "的意思,该算法在设计并发算法时较为常用,CAS算法的本质是将变量的实际值与变量的预期值进行比较,如果实际值与预期值相符,则将变量的实际值赋值成传入的新值。例如我知道这个变量应该是3,我想把它改成4,但是由于这是一个多线程环境,我知道其他人可能正在处理同一个变量,所以我首先检查这个变量的值是否和我想的一样是3,如果是,那么我就把它改成4,如果我看到这个变量现在是5,那么这意味着其他人正在处理它,所以让我现在不要碰它。

当多个线程同时使用CAS操作一个变量时,只有一个线程会成功更新,其余的会更新失败,更新失败的线程不会被暂停,而是继续尝试操作,当然,更新失败的线程也可以提前返回,所以CAS算法是非阻塞的,基于上述原则,CAS操作可以在没有锁的帮助下实现适当的并发处理。

ABA问题

ABA问题是CAS算法的一个缺点。实现CAS算法的一个重要前提是在某一时刻取出内存中的数据,并在下一时刻进行比较和替换,在这个时间差中,数据可能发生变化。假设有两个线程需要对内存中的一个变量进行CAS操作,线程一首先从内存中获得变量A的值a,线程二也从内存中获得变量A的值a,并将变量A的值a修改为b,完成一系列操作之后将b再改为a,此时,线程一进行CAS操作,发现内存中变量A的值仍然是a,于是认为与预期值一致,操作成功。虽然线程一的CAS操作是成功的,但这并不意味着这个过程中没有问题。

ABA问题可以通过版本号来解决,每一次数据被修改,都会带来一个版本号。如果版本号与数据版本一致,则数据被修改,版本号为+1,否则执行失败,因为每次操作的版本号都会增加,所以不需要担心ABA问题。

使用java模拟CAS算法;

class CompareAndSwap {
    private int value;
    //获取内存值
    public synchronized int get() {
        return value;
    }
    //交换
    public synchronized int compareAndSwap(int expectedValue, int newValue) {
        //获得内存值
        int oldValue = value;
        //比较
        if (oldValue == expectedValue) {
            this.value = newValue;
        }
        return oldValue;
    }
    //cas
    public synchronized boolean compareAndSet(int expectedValue, int newValue) {
        return expectedValue == compareAndSwap(expectedValue, newValue);
    }
}
public class TestCompareAndSwap {
    private static CompareAndSwap cas = new CompareAndSwap();
    public static void main(String[] args) {
        for (int i = 0; i < 10; i++) {
            new Thread(new Runnable() {
                public void run() {
                    int expectedValue = cas.get();
                    boolean b = cas.compareAndSet(expectedValue, (int) (Math.random() * 101));
                    System.out.println(b);
                }
            }).start();
        }
    }
}

image.gif


相关文章
|
Java 编译器
解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略
解密Java多线程中的锁机制:CAS与Synchronized的工作原理及优化策略
|
3月前
|
安全 Java API
JAVA并发编程JUC包之CAS原理
在JDK 1.5之后,Java API引入了`java.util.concurrent`包(简称JUC包),提供了多种并发工具类,如原子类`AtomicXX`、线程池`Executors`、信号量`Semaphore`、阻塞队列等。这些工具类简化了并发编程的复杂度。原子类`Atomic`尤其重要,它提供了线程安全的变量更新方法,支持整型、长整型、布尔型、数组及对象属性的原子修改。结合`volatile`关键字,可以实现多线程环境下共享变量的安全修改。
|
4月前
|
安全 Java 调度
解锁Java并发编程高阶技能:深入剖析无锁CAS机制、揭秘魔法类Unsafe、精通原子包Atomic,打造高效并发应用
【8月更文挑战第4天】在Java并发编程中,无锁编程以高性能和低延迟应对高并发挑战。核心在于无锁CAS(Compare-And-Swap)机制,它基于硬件支持,确保原子性更新;Unsafe类提供底层内存操作,实现CAS;原子包java.util.concurrent.atomic封装了CAS操作,简化并发编程。通过`AtomicInteger`示例,展现了线程安全的自增操作,突显了这些技术在构建高效并发程序中的关键作用。
75 1
|
7月前
|
算法 安全 Java
Java多线程基础-12:详解CAS算法
CAS(Compare and Swap)算法是一种无锁同步原语,用于在多线程环境中更新内存位置的值。
73 0
|
5月前
|
安全 Oracle Java
(四)深入理解Java并发编程之无锁CAS机制、魔法类Unsafe、原子包Atomic
其实在我们上一篇文章阐述Java并发编程中synchronized关键字原理的时候我们曾多次谈到过CAS这个概念,那么它究竟是什么?
128 1
|
7月前
|
安全 Java 编译器
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
Java 多线程系列Ⅴ(常见锁策略+CAS+synchronized原理)
|
7月前
|
算法 Java
Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
【5月更文挑战第15天】Java中CAS算法的集中体现:Atomic原子类库,你了解吗?
57 1
|
6月前
|
安全 Java
并发编程-Java如何实现原子操作(CAS或锁)
并发编程-Java如何实现原子操作(CAS或锁)
39 0
|
7月前
|
存储 安全 Java
【Java EE】CAS原理和实现以及JUC中常见的类的使用
【Java EE】CAS原理和实现以及JUC中常见的类的使用
|
7月前
|
Java 程序员 C++
Java中CAS详解
Java中CAS详解
61 0