您的位置:首页 > 编程语言 > Java开发

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

2017-07-04 12:43 309 查看

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

原子性:具有不可分割性。比如 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无锁原理及广泛应用

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java CAS 线程 并发 volatile