CAS, ABA, volatile“特性?
CAS 操作包含三个操作数 内存位置 (M)、预期原值 (A) 和新值(B)。如果内存地址里面的值和A的值是一样的,那么就将内存里面的值更新成B.CAS是通过无限循环来获取教据的,若果在第轮循环中,a线程获取地址里面的值被b线程修改了,那么a线程需要白旋,到下次循环才有可能机会执行。
ABA问题:CAS算法实现一个重要前提需要取出内存中的某时刻的数据并在当下时刻比较并交换,那么在这个时间差类会导致数据的变化。比如, 一个线程one从内存位置V中取出A,这个时候品外一个线程to也从内存中取出A,并且线程two进行了一些操作,将值变成了B,然后线程two又将V位置的数据变成A,这个时候线程one进行CAS操作发现内存中仍然是A,然后线程one操作成功。尽管线程one的CAS操作成功,但是不代表这个过程就是没有问题的。
volatile变量的特性:
可见性:线程1从主内存中拿数据1到自己的线程工作空间进行操作 (假设是加1) 这个时候数据1已经改为数据2了,将数据2写回主内存时通知其他线程(线程2,线程3),主内存中的数据1已改为数据2了,计其他线程重新拿新的数据(数据2)
不保证原子性:线程1从主内存中拿了一个值为1的数据到自己的工作空间里面进行 加1的操作,值变为2,写回主内存,然后还没有来得及通知其他线程,线程1就被线程2抢占了,CPU分配,线程1被挂起,线程2还是拿着原来主内存中的数据值为1进行加1,值变成2,写回主内存,将主内存值为2的替换成2,这时线程1的通知到了,线程见重新去主内存掌值为2的数据
禁止指令重排:首先指令重排是程序执行的时候不总是从上往下执行的,就像高考答题,可以先做容易的题目再做难的,这时做题的顺序就不是从上往下了。禁止指令重排就杜绝了这种情况。