源码解析:CAS原子性如何保证?ABA问题如何解决?这下面试和实操你绝对会了!

关注公众号:”奇叔码技术“
回复:“java面试题大全”或者“java面试题”
即可领取资料

github所有源码地址:

https://github.com/STmission/LqSouceCodeForCollection.git

内容分为:

1、CAS原理之AtomicInteger源码解析

2、CAS累加操作具体流程图-CASTest3

3、CAS的ABA问题和解决方案

4、面试回答

一、CAS原理之AtomicInteger源码解析

源码解析:CAS原子性如何保证?ABA问题如何解决?这下面试和实操你绝对会了!_第1张图片

二、CAS累加操作具体流程图-CASTest3

源码解析:CAS原子性如何保证?ABA问题如何解决?这下面试和实操你绝对会了!_第2张图片

三、CAS的ABA问题和解决方案

源码解析:CAS原子性如何保证?ABA问题如何解决?这下面试和实操你绝对会了!_第3张图片

四、面试回答:

CAS是java中Unsafe类里面的一个方法,它的全称是叫CompareAndSwap即比较并交换的意思。,一般使用的是三个方法为:


public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);

public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);

public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var5);

他的主要功能是能够保证在多线程的环境下对于共享变量判断比较和修改交换两个操作的一个原子性。


四个参数分别为:var1当前对象实例,var2(要进行比较和修改的变量)在内存地址中的一个偏移量的值,var4预期值,var5期望更改后的值。


CAS机制,会比较var2内存地址偏移量对应的值,和传入的预期值var4是否相等,如果相等,就直接修改内存地址中的var2的值为var5,并返回true。否则返回false。这个过程是一个原子性的。不会存在线程安全问题。

compareAndSwapInt(Object var1, long var2, int var4, int var5)
是一个native方法,实际上底层是操作系统CPU 会执行 cmpxchg 指令,处理器会自动锁定总线,防止其他 CPU 访问共享变量,然后执行比较和交换操作,最后释放总线,从而去保证,比较和替换两个操作的原子性。也就说明其实CAS也是加锁了,只是是在CPU的cmpxchg指令进行锁定总线实现的。

CAS适用于并发场景:

1、典型的是我们的JUC包中的Atomic的原子实现,例如:AtomicInteger

2、实现多线程对共享资源竞争的互斥性质,例如我们的JDK1.7中的ConcurrentHashmap的Segment对象创建时就进行了使用


使用CAS的问题:

1、同样的对于CAS会有ABA问题,在多个线程的访问时,一个线程把内存的A值修改B值,此时,又有一个线程把内存的B值修改了A值。第三个线程就以为是A值需要进行修改。这里就有问题了,实际它是已经被修改过的值。

对于此类问题,一定要加一个标识,即每次修改则加1的一个标识,或者版本号等。

可以使用我们的AtomicStampedReference<>(初始值,初始印章)


2、如果线程多,则等待时间太长即循环时间太长,则CPU的开销大。这里一般是while(true)的自旋比较耗费资源,第一次判断不是期望值,则为false,第二次判断又不是期望值,又为false,一直循环(如果倒霉的话)


3、一般适用于一个共享变量的原子操作(如果是多个共享变量则需要用锁解决)(注意这里对象也是可以玩儿的,只是多个变量就不能玩儿了)


五、最后!!!

点赞
评论
关注我

END
期待下篇来临!

你可能感兴趣的:(面试,java,职场和发展)