CAS算法
/**
* CAS(Compare-And-Swap)算法保证了数据的原子性
* CAS算法是硬件对于并发操作共享数据的支持
* CAS包含了3个操作数:
* 内存值 V 看成两步 读取内存值为1步
*
* 预估值 A 后面两步同时发生
* 更新值 B
* 当且仅当V == A时,V = B,否则不做任何操作
* 下面用Java锁模拟CAS算法:
*/
public class CAS { private int value =0; public CAS() {
}
public CAS(int value) {
this.value = value;
} public synchronized int getValue() {
return value;
} private synchronized int compareAndSwap(int expectedValue, int newValue){
int oldValue = value;
if(oldValue == expectedValue)
value = newValue;
return oldValue;
} public synchronized boolean compareAndSet(int expected, int newValue){
return expected == compareAndSwap(expected, newValue);
}
}
下面对于上面的CAS算法进行测试:
package volatile_1; import java.util.ArrayList;
import java.util.List; public class Test { private CAS cas = new CAS();
@org.junit.Test
public void Test() {
List<Thread> threadList = new ArrayList<>();
for(int i=0; i<100; ++i){//100个线程
Thread t = new Thread(()->{
for(int j=0; j < 10000; ++j){//每个线程将value值+10000
count();
}
});
threadList.add(t);
} threadList.forEach(Thread::start);//启动线程
threadList.forEach(t->{//等待所有线程执行结束
try {
t.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
});
System.out.println(cas.getValue());//打印value值,理论上为1000000
} /**
* 修改cas中的值
*/
private void count(){
while(true){
int i= cas.getValue();
boolean suc = cas.compareAndSet(i, ++i);//每次加一
if(suc)
break;
}
}
}
结果为:
1000000
说明通过Java代码模拟了CAS算法。
CAS算法的更多相关文章
- Compare and Swap [CAS] 算法
一个Java 5中最好的补充是对原子操作的支持类,如AtomicInteger,AtomicLong等.这些类帮助你减少复杂的(不必要的)多线程代码,实际上只是完成一些基本操作,如增加或减少多个线程之 ...
- (转)利用CAS算法实现通用线程安全状态机
在多线程环境下,如果某个类是有状态的,那我们在使用前,需要保证所有该类的实例对象状态一致,否则会出现意向不到的bug.下面是通用线程安全状态机的实现方法. public class ThreadSav ...
- 三、原子变量与CAS算法
原子变量:jdk1.5 后 java.util.concurrent.atomic 包下提供了常用的原子变量: - AtomicBoolean - AtomicInteger - AtomicLong ...
- 3. 原子变量-CAS算法
1. 是什么 ? 2. CAS算法模拟 package com.gf.demo03; public class TestCompareAndSwap { public static void main ...
- Java多线程系列——原子类的实现(CAS算法)
1.什么是CAS? CAS:Compare and Swap,即比较再交换. jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronou ...
- (一)juc线程高级特性——volatile / CAS算法 / ConcurrentHashMap
1. volatile 关键字与内存可见性 原文地址: https://www.cnblogs.com/zjfjava/category/979088.html 内存可见性(Memory Visibi ...
- 原子性 CAS算法
一. i++ 的原子性问题 1.问题的引入: i++ 的实际操作分为三个步骤:读--改--写 实现线程,代码如下: public class AtomicDemo implements Runnabl ...
- Java多线程-----原子变量和CAS算法
原子变量 原子变量保证了该变量的所有操作都是原子的,不会因为多线程的同时访问而导致脏数据的读取问题 Java给我们提供了以下几种原子类型: AtomicInteger和Ato ...
- java CAS算法
CAS算法是硬件对于并发操作的支持,其中包含了三个操作数:内存值,预估值和更新值.没当要执行更新操作时,会先在同步方法中比较内存值和预估值是否相等,如果相等才会用更新值替换内存值,否则什么也不做. p ...
- Java-JUC(三):原子性变量与CAS算法
原子性 并发程序正确地执行,必须要保证原子性.可见性以及有序性.只要有一个没有被保证,就有可能会导致程序运行不正确. 原子性:一个操作或多个操作要么全部执行完成且执行过程不被中断,要么就不执行. 可见 ...
随机推荐
- 数论TIPS(Loading...)
1.一个数的约数和=(1+p1+p12+...+p1c1)*(1+p2+p22+...+p2c2)*...*(1+pk+pk2+...+pkck)(p为这个数的各个质因数,c表示为各个质因数的次方,k ...
- 36.QT地图
widget.h #ifndef MAPWIDGET_H #define MAPWIDGET_H #include <QGraphicsView> #include <QLabel& ...
- 数据库SQL语句错误
Caused by: android.database.sqlite.SQLiteException: near "where": syntax error(Sqlite co ...
- 移动端 AnyProxy HTTPS 配置
参考:AnyProxy HTTPS相关教程 参考教程中,说明了 Windows 和 Mac 系统的配置,这里补充一下移动端(Android.iOS)的配置 生成RootCA > 下载 rootC ...
- Linux apache tomcat
[root@node1 ~]# mv jdk-7u79-linux-x64.tar.gz /usr/local/[root@node1 ~]# cd /usr/local/[root@node1 lo ...
- luoguP4921 情侣?给我烧了! 组合数_容斥原理_计数问题
Code: #include <cstdio> #include <algorithm> #include <cstring> #define setIO(s) f ...
- Pyhton学习——Day46
# 数据库:存储数据的仓库# 数据库更多的是安全.备份# 客户端取服务端的数据实际都是从服务端的内存中抓取数据# 数据库管理系统软件# 数据库管理系统(Database Management Syst ...
- jq——属性和方法
ps:所有元素要加上“” 属性: 1) attr:属性,元素.attr(); 获取属性 $("input").click(function(){ console.log($( ...
- webpack安装,npm WARN optional SKIPPING OPTIONAL DEPENDENCY,npm WARN notsup SKIPPING OPTIONAL DEPENDENCY警告
npm install webpack -g//全局安装webpack 电脑上安装完后: 其中有两个警告: npm WARN optional SKIPPING OPTIONAL DEPENDENCY ...
- logstash配置如何理解?
elasticsearch { action => "index" #The operation on ES hosts => "localhost: ...