JAVA线程并发性之CAS算法,模拟实现代码

来源:互联网 发布:2016做淘宝还赚钱吗 编辑:程序博客网 时间:2024/05/22 01:59

在了解算法之前,我们先对回顾基本概念:

原子性:具有不可分割性。比如 a=0;(a非long和double类型) 这个操作是不可分割的,那么我们说这个操作时原子操作。再比如:a++; 这个操作实际是a = a + 1;是可分割的,所以他不是一个原子操作。非原子操作都会存在线程安全问题。

volatile 关键字:当多个线程进行操作共享数据时,可以保证内存中的数据可见,使得对临界区资源的修改可以马上被其他线程看到,它是通过添加内存屏障实现的。(底层调用JVM的内存栅栏,对数据实时向主存中进行更新)

CAS:Compare and Swap,是比较并交换的意思。是一种非阻塞算法 (nonblocking algorithms)

CAS有3个操作数,内存值V,预期值A,要修改的新值B。当且仅当预期值A和内存值V相同时,将内存值V修改为B,否则什么都不做。

模拟CAS算法实现

/** * 模拟CAS算法 本案例中 synchronized所修饰方法 JVM底层通过硬件实现,本案例仅模拟 *  * @author xiaoqiang * @Time 2017-7-4 */public class CompareAndSwap {    private int value;    /**     * 获取当前内存值     *      * @return     */    public synchronized int get() {        return value;    }    /**     * 若不成功可继续操作直到成功     *      * @param expectedValue     *            预期值     * @param newValue     *            新值     * @return 是否成功     */    public synchronized boolean compareAndSwap(int expectedValue, int newValue) {        int oldValue = value;        if (oldValue == expectedValue) {            this.value = newValue;        }        return oldValue == expectedValue;    }    public static void main(String[] args) {        CompareAndSwap cas = new CompareAndSwap();        for (int i = 0; i < 20; i++) {            new Thread(() -> {                // Lambda表达式书写代码 (JDK1.8新特性)                int value = cas.get();                System.out.println(cas.compareAndSwap(value, (int) (Math.random() * 100)));            }).start();        }    }}

JAVA 8 Lambda表达式使用-> click me

CAS算法详解 ->大家可以看看两位大神写的

理解CAS算法在JAVA中的作用

java高并发:CAS无锁原理及广泛应用

原创粉丝点击