CAS compare and swap  比较和交换

2020-09-28  本文已影响0人  胡壮壮菜鸟起飞

进程:火车 一个进程可以有多个线程

线程:车厢 必须依赖火车才能运行

操作系统:铁轨 可以跑多列火车

Jmm:java 并发共享内存模型 一种抽象理解。

并发:多个线程交替运行,争抢访问共享变量

并行:在多核系统中存在,同一时刻不同cpu运行不同操作

volatile 关键字  保证可见性  禁止指令重排序但不保证原子性。如何实现? 遇到volatile修饰的变量,会在指令间插入内存屏障(memory barrier)。内存屏障指令会告诉编译器和cpu不管什么指令都不能和这条指令重排序。写操作后加入一条store屏障指令,会将工作内存中的共享变量强制刷新回到主内存,其余线程都可访问。读操作前加入load屏障指令,从主内存中读取共享变量。

atomic类:底层调用unsafe类

可见性:并发过程中,各线程对自身副本的修改可通知到其他线程

原子性:要么全部失败,要么全部成功,执行过程中不会被干扰。

Cas 保证一致性,并发性强

Synchronize 加锁 保证一致性 并发性差

Cas缺点:1.循环时间长开销大 2.只能保证一个共享变量的原子操作 3.ABA问题

ABA问题  狸猫换太子  版本号控制

AtomicStampReferance 用原子版本引用类  修饰共享变量。解决ABA问题。除了比较内存里的值还会比较版本号 类似乐观锁

怎么实现原子性  CAS 思想 ,compare and swap 比较并交换。

怎么实现?unsafe类和自旋锁。

var1 atomicinteger对象本身

var 2该对象值的引用地址

var4 需要变动的数量

var5 是通过var1和var2找出的主内存中的真实值

如果相同 更新var5+var4并返回true

如果不同 继续取值然后比较,直到更新完成

Do { var5 =this.getintvolatile(var1,var2)

}while(!this.compareandswapint(var1,var2,var5,var5+var4));

return var5

上一篇下一篇

猜你喜欢

热点阅读