原创 jdk 源碼分析(10)java unsafe 分析

jdk裏面原子操作unsafe都是native方法,看不到源代碼,所以特意下載openjdk 9 的版本。 1)獲取unsafe 對象,這個是openjdk裏的方法。通過反射獲得。 static { Reflection

原创 jdk 源碼分析(16)java CyclicBarrier 源碼解析

上一個章節分析了CountDownLatch,CountDownLatch 是等待所有線程都執行完後集合,而CyclicBarrier  是大家一起準備,然後一起開始。比起玩網絡遊戲時,需要等待大家都準備好之後再開始,又比如,測試時需要

原创 jdk 源碼分析(13)java ExecutorService 和Executors

1)Executors: Executors 是線程池的工廠類,主要生產ExecutorService 和callable 常用的線程池: newFixedThreadPool newSingleThreadExecutor

原创 jdk 源碼分析(12)java condition 條件鎖

在分析ReentrantReadWriteLock 時知道多個線程在爭論一個state,那麼當時數據放在那裏呢。都是放在syns裏,這個類繼承了AbstractQueuedSynchronizer,而裏面的node(鏈表)就是存儲數據的。

原创 jdk 源碼分析(9)java ReentrantReadWriteLock分析

前面的一個章節:jdk 源碼分析(7)ReentrantLock結構 分析了reentrantlock,裏面的所有進程都是去爭一個state,ReentrantReadWriteLock將分爲兩種情況, read/write,兩種之

原创 jdk 源碼分析(11)java ArrayBlockingQueue 緩存隊列分析

隊列沒有什麼,如圖(圖片都是網上找的),分爲頭和尾,都是FIFO(先進先出),用數組和鏈表都能存儲數據,數組當poll 數據後,需要整體移位(當然循環數組也是可以不移位的。),鏈表就方便很多。插入時在頭部添加一個,刪除是在尾部直接刪除,

原创 jdk 原地分析(3)java ConcurrentHashMap結構分析

1)存儲結構:存儲結構和hashmap相似,但是添加一個root級別的鎖。 鏈表: static class Node<K,V> implements Map.Entry<K,V> { final int hash;

原创 jdk 源碼分析(14)java ThreadLocal

在每個線程裏面維護着這樣一個集合。(Thread 裏面),這個就可以放一些私有變量。 ThreadLocal.ThreadLocalMap threadLocals = null; 重get 方法可以看出,首先會去當前線程拿到

原创 jdk 源碼分析(5)java ConcurrentSkipListMap結構

理解ConcurrentSkipListMap 只需要理解存儲方式就行了 跳錶結構之下往上分層,比如需要找117,首先會判斷最高層,先比較21,在比較37 ,再比較37左邊的,因爲左邊結束了,所以只能往下走,一直找到目標爲

原创 jdk 源碼分析(7)java ReentrantLock結構

lock看上去很牛,其實真的很牛,如果你仔細研究代碼發現,所以的lock都只是去爭一個變量state private volatile int state; 如果你能將這個state從零變成1,你就可以獲得資源, 因爲要判斷

原创 jdk 源碼分析(8)java synchronized和鎖lock對比

因爲synchronized 是關鍵字,無法看到源代碼,所以只能做一個簡單的分析對比了, synchronized 能鎖方法,也能鎖代碼塊,其實也是一種重入鎖(也就是自己的鎖,自己可以進去),代碼塊或方法離開,自動釋放鎖。