1. Java NIO浅析:https://zhuanlan.zhihu.com/p/23488863html
2. dubbo:http://dubbo.apache.org/en-us/index.htmlapache
3. 【数据结构】B-Tree, B+Tree, B*树介绍 转数据结构
4. Java CAS 原理剖析:http://www.javashuo.com/article/p-fxklxldt-cv.htmlpost
a. compareAndSwapInt(var1, var2, var5, var5 + var4)
其实换成compareAndSwapInt(obj, offset, expect, update)
比较清楚,意思就是若是obj
内的value
和expect
相等,atom
就证实没有其余线程改变过这个变量,那么就更新它为update
,若是这一步的CAS
没有成功,那就采用自旋的方式继续进行CAS
操做,取出乍一看这也是两个步骤了啊,其实在JNI
里是借助于一个CPU
指令完成的。因此仍是原子操做。url
b. CAS 的问题: spa
b1. ABA问题: CAS须要在操做值的时候检查下值有没有发生变化,若是没有发生变化则更新,可是若是一个值原来是A,变成了B,又变成了A,那么使用CAS进行检查时会发现它的值没有发生变化,可是实际上却变化了。这就是CAS的ABA问题。 常见的解决思路是使用版本号。在变量前面追加上版本号,每次变量更新的时候把版本号加一,那么A-B-A
就会变成1A-2B-3A
。 目前在JDK的atomic包里提供了一个类AtomicStampedReference
来解决ABA问题。这个类的compareAndSet方法做用是首先检查当前引用是否等于预期引用,而且当前标志是否等于预期标志,若是所有相等,则以原子方式将该引用和该标志的值设置为给定的更新值。线程
b2. 循环时间长开销大 :上面咱们说过若是CAS不成功,则会原地自旋,若是长时间自旋会给CPU带来很是大的执行开销。code