目录

一. CAS的实现原理

1.1 伪代码分析

1.2 底层实现 

二. CAS 操作示例

三. ABA问题

四. 原子类

4.1 使用原子类的目的

4.2 原子类的使用示例

五. 总结


一. CAS的实现原理

CAS(compare and swap 比较和交换)是一种用于实现无锁并发的技术.

1.1 伪代码分析

1.2 底层实现 


二. CAS 操作示例

假设有一个整数变量count, 初始值为0, 现在有A, B两个线程同时对count进行+1操作.(使用CAS无锁并发技术)

1. 线程A读取变量count的值, 得到0.

2. 线程B读取变量count的值, 得到0.

3. 线程A将变量count的值与预期的值0进行比较, 相等, 将count的值增加为1.

4. 线程B将变量count的值与预期的值0进行比较, 不相等(count的值已经被线程A增加为1), 则重试.

5. 线程B重新读取变量count的值, 得到1.

6. 线程B将变量count的值与预期的值1进行比较, 相等, 将count的值增加为2.

最终, count的值为2.


三. ABA问题

假设有两个线程, 线程1使用CAS技术将val的值从A修改成B, 又把val的值从B修改成A. 线程2通过CAS技术判断线程1没有对val的值进行修改, 于是线程2再次修改val的值(实际上不需要修改). 这就是 ABA 问题.


四. 原子类

4.1 使用原子类的目的

为了不加锁, 提高程序运行效率.

4.2 原子类的使用示例

实现一个无锁的计数器.

    static AtomicInteger count = new AtomicInteger();
    public static void main(String[] args) throws InterruptedException{
        Thread t1 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count.getAndIncrement();
            }
        });
        Thread t2 = new Thread(() -> {
            for (int i = 0; i < 50000; i++) {
                count.getAndIncrement();
            }
        });
        t1.start();
        t2.start();
        t1.join();
        t2.join();
        System.out.println(count.get());
    }

[JAVAEE] 面试题(二) - CAS 和 原子类-LMLPHP


五. 总结

11-05 15:52