进程:火车 一个进程可以有多个线程
线程:车厢 必须依赖火车才能运行
操作系统:铁轨 可以跑多列火车
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
网友评论