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 线程通讯 主线程运行10次接着子线程运行5次,如此反复运行20次代码实现
- Java 线程的生命周期 演示 线程的状态 附代码实现
- Android(java)学习笔记66:线程的实现方案2思路以及代码实现
- java模拟http请求的代码实现
- 黑马程序员——java第十一、十二天:多线程(创建线程1-2、多线程同步代码、实现Runnable接口、安全死锁)
- Java线程代码的实现方法
- java 使用线程模拟 队列实现
- Java实现等待所有子线程结束后再执行一段代码的方法
- Java线程通信的多种实现形式(代码为主)
- 银行账户模拟(线程协作) java 实现
- java swing实现页面置换算法模拟系统代码
- Java编程之多线程死锁与线程间通信简单实现代码
- java线程-synchronized实现可见性代码
- java代码-----实现4个人打牌游戏的相关代码。线程
- Java实现在不同线程中运行的代码实例
- Java线程代码实现
- 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份
- newxy技术零java代码实现文件下载,下载记数 作者:胡立新
- 用Java线程获取优异性能(II)——使用同步连载线程访问关键代码部份
- 同样一个问题的两种 java 实现代码 的比较