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无锁原理及广泛应用
阅读全文
0 0
- JAVA线程并发性之CAS算法,模拟实现代码
- Java并发编程之CAS算法
- Java并发之 CAS + Thread.join / CountDownLatch 方式实现线程安全
- java并发之CAS
- Java 并发编程之 CAS
- JAVA并发编程之CAS
- java并发之CAS操作
- java并发 之 CAS详解
- Java并发编程之CAS
- Java并发编程之CAS
- Java并发编程之CAS
- Java并发编程之CAS
- Java并发编程之CAS
- Java并发之CAS:CompareAndSwap
- Java并发编程之CAS
- Java并发编程之CAS
- Java模拟CAS的实现
- Java线程之CAS(Atomic)
- 使用Python进行代码测试
- HDU
- JVM介绍
- Problem 24 Lexicographic permutations (全排列)
- laravel ORM 打印SQL
- JAVA线程并发性之CAS算法,模拟实现代码
- JNDI本地加载
- Linux C 编程学习笔记1-GCC
- Shader学习(二)
- OkHttp与Retrofit上传文件详解
- [职场天地] 十年,干货送给后来人
- 游戏编程入门(12):开发 Battle Office(办公室战争)游戏
- C++11 lambda 表达式解析
- [Java算法分析与设计]单向链表(List)的实现和应用