import java.util.concurrent.atomic.AtomicInteger;
/**
* 使用java模拟jvm中的cas
* @author torrent
* @date 19-11-13 下午4:16
*/
public class CAS {
private static int i = 0;
private static AtomicInteger integer = new AtomicInteger(0);
private static MyAtomicInteger myAtomicInteger = new MyAtomicInteger(0);
public static void incr() {
i ++;
}
public static int getI() {
return i;
}
public static void main(String[] args) {
// for (int i = 0; i < 100; i++) {
// new Thread(CAS::incr).start();
// }
// for (int j = 0; j < 100; j++) {
// new Thread(() -> {
// int i = integer.incrementAndGet();
// }).start();
// }
for (int j = 0; j < 100; j++) {
new Thread(() -> {
int i = myAtomicInteger.incrementAndGet();
System.out.println(i);
}).start();
}
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// System.out.println(getI());
// System.out.println(integer.get());
System.out.println(myAtomicInteger.getValue());
}
}
class MyAtomicInteger {
public MyAtomicInteger(int value) {
this.value = value;
}
//加不加volatile打印结果不同
private volatile int value; //内存中的值
public synchronized int getValue() {
return value;
}
private synchronized int compareAndSwap(int exceptedValue, int newValue) {
int oldValue = value;
if (exceptedValue == oldValue) {
value = newValue;
}
return oldValue;
}
private synchronized boolean compareAndSet(int exceptedValue, int newValue) {
return exceptedValue == compareAndSwap(exceptedValue, newValue);
}
synchronized int incrementAndGet() {
boolean isSuccess;
do {
isSuccess = compareAndSet(value, value + 1);
} while (!isSuccess);
return value;
}
}
java模拟CAS操作
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- 什么是悲观锁、乐观锁?在java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽...
- 该文章属于《Java并发编程》系列文章,如果想了解更多,请点击《Java并发编程之总目录》 前言 在上一篇文章中我...
- 原文: Dyson~ - Java中的CAS操作以及锁机制详解 1. 关于CAS操作 CAS:Compare An...
- 难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ ...