java.util.concurrent.atomic
CAS是什么
cas中文翻译是比较并交换,实现并发算法时常用到的一种技术。它包含三个操作数-内存位置、预期原值和更新值。
执行cas操作的时候,将内存位置的值和预期原值比较,如果匹配,那么处理器会自动将该位置的值更新为新值,如果不匹配,处理器不做任何操作,多个 线程同时执行cas操作只能一个成功。
cas硬件级别的保证
源码级别
cas底层原理?如果知道,谈谈对unsafe的理解。
i++线程不安全,使用atomicInteger.getAndDecrement()的理解
执行例子
从汇编角度分析
总结话术
CAS是靠硬件实现的从而在硬件层面提升效率,最底层还是交给硬件来保证原子性和可见性,实现方式是基于硬件平台的汇编指令,在intel的cpu中(x86机器上),使用的是汇编指令cmpxchg指令。
核心思想就是:比较要 更新变量的值V和预期值E,相等才会将V的值设为新值N,如果不相等自旋再来。
AtomicReference的使用
AtomicReference<User> atomicReference =new AtomicReference<>();
User zhangsan = new User("zhangsan", 1);
atomicReference.set(zhangsan);
User lisi = new User("lisi", 2);
System.out.println(atomicReference.compareAndSet(zhangsan, lisi));
System.out.println(atomicReference.get());
结果
cas与自旋锁,借鉴CAS的思想
自旋锁demo
public class SpinLockDemo {
AtomicReference<Thread> atomicReference = new AtomicReference<>();
public void lock(){
Thread thread = Thread.currentThread();
System.out.println(thread.getName()+"come in");
while(!atomicReference.compareAndSet(null,thread)){
}
}
public void unLock(){
Thread thread = Thread.currentThread();
atomicReference.compareAndSet(thread,null);
System.out.println(thread.getName()+"task over ---------");
}
public static void main(String[] args) {
SpinLockDemo spinLockDemo = new SpinLockDemo();
new Thread(()->{
spinLockDemo.lock();
try {
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
spinLockDemo.unLock();
},"A").start();
try {
TimeUnit.MILLISECONDS.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
new Thread(()->{
spinLockDemo.lock();
spinLockDemo.unLock();
},"B").start();
}
}
cas的缺点
1 循环时间长 开销大
2 引出ABA问题