整体认识
原子性的实现简单的 i++操作。
使用的os地城指令为: cmpxchg
java对该指令进行了封装compareAndSetInt(this, VALUE, expectedValue, newValue)
解释一下其中的参数意思:
- this: 表示当前对象
- VALUE: 表示该变量在当前对象地址的偏移量,该对象地址是展示的是地址始址
- expectedValue: 期望的值
- newValue:要改成的值;
这个函数其实需要用户传入的是expectecValue 和 newValue,当该变量当前值和expectecValue的值一致的时候,就会执行将该变量当前的值改为newValue的值。
CAS问题
在高并发下可能会产生ABA问题,这里相当于Mysql中的“幻读”问题。
解决方案
- 直接加锁
- 使用AtomicStampedReference
- compareAndSet()
compareAndSet(V expectedReference,
V newReference,
int expectedStamp,
int newStamp)
参数解释:
- expectedReference:期望值
- mewReference: 要改成的值
- expectedStamp: 期望版本号
- newStamp :要更新的版本号
AtomiicStampedReference的解决方案就是加入了版本号,这样即使把值改回来了,但是版本号对不上了,就能对ABA问题有个判断的依据。