CAS机制
2018-07-18 15:52:39 0 举报
CAS机制
作者其他创作
大纲/内容
汇编层
Unsafe
5.2 替换成功,返回
CAS(AtomicInteger为例)
1. 获取变量在内存中的偏移地址unsafe.objectFieldOffset(field)
Atomic::cmpxchg
CAS机制及缺陷
0.0 volatile修饰变量0.1 获取unsafe实例
5.1 替换失败(old和内存的值不一样),循环重新获取-比较-替换
Q & A1. 如何获取unsafe实例? 通过反射机制获取Unsafe实例。 我们知道sun.misc.Unsafe是HotSpot提供给开发者用于直接操作内存和线程底层的后门,广泛用于nio和concurrent包,但Unsafe是不安全的,所有增加了一些限制:①单例模式,私有化构造器;②getUnsafe的调用其只能被Bootloader加载;基于这些限制,我们只能通过反射机制获取Unsafe实例(Field:theUnsafe)2. CAS中的变量叠加方法如何保证原子性的? cmpxchg执行前判断处理器类型, 如果是多核处理器,添加lock前缀保证只会被一个线程操作;如果单核处理器,省略lock前缀,因为单处理器自身会维护处理器内部的顺序一致性。 3. CAS的缺陷?ABA问题,即变量初始是A,然后被改成B,最后又改回A,CAS操作会误认为它从来没有被修改过。针对这种情况,java并发包提供了带有版本标记的原子引用类AtomicStampedReference,通过控制变量值的版本保证CAS正确性。
0 条评论
下一页