1、原子操作:不可被中断的一个或一系列操作。
2、处理器实现原子操作
(1)使用总线锁保证原子性:LOCK#信号锁住总线,处理器独占共享内存。
(2)通过缓存锁来保证原子性:指内存区域如果被缓存在处理器的缓存行中,并且在Lock操作期间被锁定,当它执行锁操作回写到内存时,处理器不在总线上声言LOCK#信号,而是修改内部的内存地址,因为缓存一致性机制会阻止同时修改两个以上处理器缓存的内存区域数据,当其他处理器回写已被锁定的缓存行的数据时,会使缓存行无效。
(3)当操作的数据不能被缓存或操作的数据跨多个缓存行,以及处理器不支持缓存锁的时候,处理器只能调用总线锁。
3、Java实现原子操作
(1)循环CAS实现:在操作值的时候,检查当前值有没有发生过变化,如果没有变化则更新,JDK的并发包里提供了一些类来支持原子操作,如AtomicBoolean、AtomicInteger和AtomicLong。
CAS实现原子操作的三大问题:
ABA问题:可以通过JDK1.5的Atomic包里提供的AtomicStampedReference来解决,这个类的compareAndSet方法的作用是首选检查当前引用是否等于预期引用,并且检查当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。
循环时间长开销大问题:如果JVM能支持处理器提供的pause指令,那么效率会有一定的提升。
单一共享变量问题:可以使用AtomicReference类来保证引用对象之间的原子性,就可以把多个变量放在一个对象里面进行CAS操作。
(2)使用锁机制来实现原子操作:除了偏向锁,JVM实现锁的机制都利用了循环CAS的方式来获取锁和释放锁。
原文:https://www.cnblogs.com/xy80hou/p/11217198.html