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 ...