第二章-CAS知道吗

比较并交换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/**
* @desc CAS保证原子性
* T1 100 -> 101
* T2 100 -> 2019
* @Author xw
* @Date 2019/8/20
*/
public class CasDemo {
public static void main(String[] args) {
AtomicInteger atomicInteger = new AtomicInteger(100);
// T1 100 -> 101
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "\t updated: " + atomicInteger.compareAndSet(100, 101) + ",value: " + atomicInteger.get());
}, "T1").start();
// T2 100 -> 2019
new Thread(() -> {
try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) { e.printStackTrace(); }
System.out.println(Thread.currentThread().getName() + "\t updated: " + atomicInteger.compareAndSet(100, 2019) + ",value: " + atomicInteger.get());
}, "T2").start();
}
}

CAS底层原理?谈谈你对unsafe的理解

  1. atomicInteger.getAndIncrement();

  2. Unsafe

    image-20191107102715932

  3. CAS是什么

unsafe.getAndAddInt

image-20191107102804096

底层汇编

image-20191107102822437

小总结

CAS(CompareAndSwap)
比较当前工作内存中的值和主内存中的值,如果相同则执行规定操作,

CAS应用
CAS有3个操作数,内存值V,旧的预期值A,要修改的更新值B。
当且仅当预期值A和内存值V相同时,将内存V修改为B,否则什么都不做。

CAS缺点

  • 循环时间长,开销很大
  • 只能保证一个共享变量的原子操作
  • 引出来ABA问题???