Java之CAS无锁算法

本文介绍了CAS(Compare and Swap)无锁算法,这是一种非阻塞算法,常用于多线程间的变量同步。Java 5.0引入了原子变量类支持CAS操作,包括AtomicInteger、AtomicLong等,以高效的方式解决并发问题。然而,CAS存在ABA问题、循环时间过长可能导致CPU高负荷以及操作多个共享变量不便等问题。解决方案包括使用版本号来跟踪变量变化和使用锁来保证同步。Java中的并发工具如AtomicReference和RxJava等广泛使用了CAS。
摘要由CSDN通过智能技术生成

 如果一个线程失败或挂起不会导致其他线程也失败或挂起,那么这种算法就被称为非阻塞算法。而CAS就是一种非阻塞算法实现,也是一种乐观锁技术。它能在不使用锁的情况下实现多线程之间的变量同步,所以CAS也是一种无锁算法。

1、CAS的实现

 CAS包含了3个操作数——需要读写的内存位置V、进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,CAS才会通过原子方式用新值B来更新V的值,否则不会执行任何操作,下面来看模拟CAS的实现。

    //CAS模拟实现
    public class SimulatedCAS {
   
        private int value;
    
        public synchronized int get() {
   
            return value;
        }
    
        public synchronized int compareAndSwap(int expectedValue, int newValue) {
   
            int oldValue = value;
            if (oldValue == expectedValue) {
   
                value = newValue;
            }
            return oldValue;
        }
    
        public synchronized boolean compareAndSet(int expectedValue, int newValue) {
   
            return (expectedValue == compareAndSwap(expectedValue, newValue));
        }
    }

SimulatedCAS就是模拟CAS的实现,因为这里仅仅是模拟CAS,明白其语义,所以代码还是很简单的。

    //基于CAS实现的一个线程安全计数器
    public class CasCounter {
   
        private SimulatedCAS value;

        public int getValue() {
   
            return value.get();
        }

        public int increment() {
   
            int v;
            do {
   
                v = value.get();
            } while (v != value.compareAndSwap(v, v + 1));
            return v + 1;
        }
    }

CasCounter就是基于SimulatedCAS实现的一个线程安全的计数器,CasCounter不会阻塞,但如果其他线程同时更新更新计数器,那么将会多次执行重试操作。理论上,如果其他线程在每次竞争CAS时总是获胜,那么这个线程每次都会重试,但实际上很少发生这种类型的饥饿问题。

3、原子变量类

 Java5.0引入了底层的支持,在int、long和对象引用等类型上也都公开了CAS操作,并且JVM把它们编译为底层硬件提供的最有效方法。在支持CAS的平台,运行时把它们编译为相应的(多条)机器指令。最坏的情况下,如果不支持CAS指令,那么JVM将使用自旋锁。因此Java提供的CAS解决方案就与平台/编译器紧密相关,其性能也受平台/编译器影响。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值