原创 LockFreeHashMap:無阻塞代碼技巧

10年前,cliff click博士就爲關聯數據結構ConcurrentHashMap給出了一個採用open Address的無阻塞實現(NonBlockingHashMap)。其中爲了減少線程之間執行順序的依賴而採用的算法充滿技巧性。這

原创 Java Thread&Concurrency(16): 深入理解ArrayBlockingQueue及其實現原理

ArrayBlockingQueue是一個基於數組和鎖的有容量限制的阻塞隊列,事實上它的阻塞能力來自於鎖和條件隊列。 我們對關鍵代碼展開: public boolean offer(E e, long timeout, Time

原创 pthread_mutex_lock實現

我們來考察下pthread中鎖的實現。 首先看下初始化宏:PTHREAD_MUTEX_INITIALIZER。 # define PTHREAD_MUTEX_INITIALIZER \ { { 0, 0, 0, 0, 0, _

原创 Java多線程:內存可見性

Java中對於volatile變量,通俗點說可以把它看做多線程之間分享的共享內存,可見性是立即的。 實際上它分成了兩部分,volatile write和volatile read。由於Unsafe提供了getXXXVolatile和put

原创 RocketMQ:索引源碼分析

RocketMQ是阿里開源的一款高性能高吞吐的消息中間件,我們來研究下它是如何實現的,重點關注索引。 我們拿一個執行用例來測試,代碼如下: /* * Licensed to the Apache Software Foundation

原创 pthread_mutex_unlock實現

我們接着看pthread_mutex_unlock的實現,會發現它跟pthread_mutex_lock形式差不多,並且底層調用futex換樂FUTEX_WAKE而已。 直接貼路徑代碼: int __pthread_mutex_unlo

原创 併發編程中的一致性問題:ForkJoinPool調用shutdown的bug.(jdk8&jdk9)

ForkJoinPool調用shutdown從而終止整個併發執行框架。 包括取消所有隊列中已有的任務,終止所有的工作線程。 考慮這樣一個場景,一個線程正在提交任務,另一個線程正在調用shutdown終止線程池。 此時涉及到3個獨立的執行邏

原创 Java Thread&Concurrency(14): 深入理解條件隊列(Condition)及其實現原理

對於可重入鎖(ReentrantLock)的使用以及它的實現我們都已經熟悉了,本文來探究與其緊密相關的條件隊列的具體實現。 在java中,所謂的條件(condition)是在已經持有鎖的情況下,由newCondition方法創建出來。我們

原创 Bug:StampedLock的中斷問題導致CPU爆滿

StampedLock作爲JAVA8中出現的新型鎖,很可能在大多數場景都可以替代ReentrantReadWriteLock。它對於讀/寫都提供了四個接口(換成write爲寫鎖): readLock()tryReadLock()tryR

原创 Java Thread&Concurrency(11): 深入理解ThreadPoolExecutor及其實現原理

背景(註釋): 一個ExecutorService通過使用不同的線程池來執行提交的任務,線程池可以通過Executors來配置。 線程池主要解決兩個問題:改善執行大量任務時的性能(通過一個任務/調用的模式)和提供資源方面(比如線程、執行的

原创 Bug:ForkJoinTask的異常獲取錯誤

這是個低級錯誤,本意是在獲取異常對象時,假如當前線程不是拋出異常的線程則儘可能重新new一個,但是判斷語句混入了.....: if (false && e.thrower != Thread.currentThread(

原创 Java Thread&Concurrency(0):JUC

JDK中,由Doug Lea主導的併發包JUC依賴於三個基本元素: 線程間內存共享:volatile、Happens-Before等。CAS語義和volatile語義的操作:compareAndSwapXXX(衝突檢測機制)、getO

原创 Java Thread&Concurrency(13): 深入理解ConcurrentLinkedQueue及其實現原理

ConcurrentLinkedQueue是一個基於鏈表實現的非阻塞隊列,特點是head和tail是可以滯後的,甚至tail落到head的後面,準確得說,是當事實的head距離當前head至少兩個link時纔會修改head,這種設計可以在

原创 Java Thread&Concurrency(10): 深入理解ThreadLocal及其實現原理

背景(註釋): ThreadLocal提供了線程私有變量。每一個變量對於每個線程來說都會有唯一的一個副本,通過get方法得到或者set方法設置,獨立於其他線程的版本。ThreadLocal變量是典型的字段,只用於當前的一個線程(比如use