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