原创 Java Thread&Concurrency(3): 深入理解SynchronousQueue實現原理

背景: 一個BlockingQueue的是一個這樣的隊列,每個插入操作都必須等待另一個刪除操作,反過來也一樣。一個同步隊列沒有內部容量這個概念。你不能使用peek操作,因爲一個元素僅在你試着刪除它的時候才能夠被取得。你不能插入一個元素(

原创 Java Thread&Concurrency(8): 深入理解CompletionService接口及其實現

背景(註釋): 我們接着來看下CompletionService接口和它的實現ExecutorCompletionService。 CompletionService接口提供了一種在產生的異步任務和任務的計算結果之間解耦的服務。生產者通過

原创 Java Thread&Concurrency(7): 深入理解Callable/Future(FutureTask)接口及其實現

背景(註釋): 使用Callable可以定義一個返回結果的任務(過程中可能拋出異常)。 實現它只需要返回一個結果,不提供參數。 這個Callabel接口類似於Runnable,兩者都是被設計用於被其他線程執行。區別是Runnable無法

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

背景(註釋): 一個基於容量並且帶有三種模式的鎖,用於控制讀取/寫入訪問。StampedLock的狀態由版本和模式組成。鎖獲取操作返回一個用於展示和訪問鎖狀態的郵編(stamp)變量:這些方法的"try"版本通過返回0代表獲取鎖失敗。鎖釋

原创 Java Thread&Concurrency(5): 深入理解Phaser實現原理

背景(來自注釋): Phaser作爲一個可複用的同步屏障來使用,在功能上相似於CyclicBarrier和CountDownLatch,但是支持更靈活的使用場景。 Registration.不像其他的屏障,在一個Phaser上註冊的同步

原创 Bug:LinkedTransferQueue的數據暫失和CPU爆滿以及修復

前幾天讀LinkedTransferQueue(以下簡稱ltq)的源碼,想加深下對鬆弛型雙重隊列的理解,無意中發現了這個問題:),經過仔細檢查後確認了這是個bug,存在於JDK1.7.0_40和剛發佈的JDK8中,去google和ora

原创 Java Thread&Concurrency(4): 深入理解Exchanger實現原理

背景(來自注釋): Exchanger的作用是作爲一個同步點,線程通過它可以配對交換數據。 每個線程可以通過exchange方法來傳遞想要傳遞的數據,並且返回時接受其他線程傳遞的數據。一個Exchanger可以看做是雙向的Synchro

原创 Java Thread&Concurrency(2): 深入理解ConcurrentSkipListMap實現原理

背景(註釋): 一個併發的類似ConcurrentNavigableMap的實現。 這個map通過實現Comparable或者提供一個Comparator來實現排列的,通過構造函數來提供。 這個實現是一個SkipLists的併發版本並

原创 Bug:LinkedTransferQueue的數據暫失和CPU爆滿

經過仔細檢查後確認了這是個bug,存在於JDK1.7.0_40和剛發佈的JDK8中,去google和oracle官方似乎也沒有搜索到這個問題。 重現bug:先來重現下這個bug,由於對併發線程的執行順序預先不能做任何假設,所以很可能根

原创 Java Thread&Concurrency(1): 深入理解Fork-Join併發執行框架

關於框架fork-join的概述網上很多,本文深入剖析java平臺下fork-join的實現。 作爲一個輕量級的併發執行框架,fork-join事實上由3個角色構成:任務隊列(WorkQueue)、工作者線程(ForkJoinWorker

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

接口ScheduledExecutorService通過繼承ExecutorService提供了以預定的方式來執行任務的能力,可以用於代替java.util.Timer。 所提供的一個具體實現爲ThreadPoolExecutor,另一方

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

AbstractExecutorService主要是作爲ExecutorService的一個抽象實現,本身是一個抽象類。最後的執行會依託於execute方法。 它提供了類似如下的方法: public Future<?> subm

原创 Java實現臨界區:經典併發控制回顧

只要有一定的內存order保證,不通過比較並交換(CAS)那些需要硬件支持的原子操作,能不能實現一個互斥的臨界區?答案是:能。 計算機先驅 Edsger Wybe Dijkstra,50多年前的這篇經典paper中就提出瞭解決方案。並且

原创 JVM:鎖實現(synchronized&JSR166)行爲分析和相關源碼

JVM中有這樣一段註釋: // The base-class, PlatformEvent, is platform-specific while the ParkEvent is // platform-independent. Pl

原创 Scalable Hazard Pointers

由於我對於Java併發庫JUC的深入瞭解,一直以來有個想法,能不能把Java併發庫移植到純C語言環境下,並且在實現、使用方式上都與Java平臺保持相當程度的相似性呢?純C環境下內存模型與Java平臺不一致?