大家好,我是
方圆
我们一定要学好多线程
目录
1. 你给我说说,嘛是CAS?
不,你想听。
CAS的中文名叫“比较并交换”
,它是CPU指令
,不能被打断,也是我们常见的乐观锁
的实现原理,CAS中有三个操作数,分别为内存值
,预期值
,和要修改的值
,当且仅当内存值和预期值相同,才会将其修改,否则不修改。
1.1 现在我们来自己写个CAS原理Demo
听明白了就爱学习了吧,接着看
public class Demo {
//内存值
private volatile int value;
//期望值和修改后的值都有了,这个方法用synchronized修饰
public synchronized void compareAndSwap(int expectedValue, int newValue){
if(expectedValue == value)
value = newValue;
}
}
2. 分析AtomicInteger的源码
2.1 我们重点看看getAndIncrement方法
操作的是当前对象
,value的地址值
,增加值为1
public final int getAndIncrement() {
return unsafe.getAndAddInt(this, valueOffset, 1);
}
其中,getAndAddInt方法运用了CAS的自旋
其中getiIntVolatile方法,是被native修饰的c++方法
- 总结一下
AtomicInteger加载Unsafe工具,用来直接操作内存
数据
用volatile修饰字段,保证可见性
3. 简单说说Unsafe类
- Unsafe是CAS的核心类,Java无法直接访问底层操作系统,而是通过
native
修饰的方法来访问 - valueOffset表示的是变量值在内存中的偏移地址,因为Unsafe就是根据内存偏移地址获取数据原值,这样我们才通过Unsafe来实现CAS
入入门