原创 二叉樹的前序,中序,後序遍歷方法總結

前言 二叉樹的前序遍歷,中序遍歷,後序遍歷是面試中常常考察的基本算法,關於它的概念這裏不再贅述了,還不瞭解的同學可以去翻翻LeetCode的解釋。 這裏,我個人對這三個遍歷順序理解是:前 中 後 這三個詞是針對根節點的訪問順序而言的,即前序

原创 FutureTask源碼解析(2)——深入理解FutureTask

前言 系列文章目錄 有了上一篇對預備知識的瞭解之後,分析源碼就容易多了,本篇我們就直接來看看FutureTask的源碼。 本文的源碼基於JDK1.8。 Future和Task 在深入分析源碼之前,我們再來拎一下FutureTask到底是幹嘛

原创 FutureTask源碼解析(1)——預備知識

前言 系列文章目錄 FutureTask 是一個同步工具類,它實現了Future語義,表示了一種抽象的可生成結果的計算。在包括線程池在內的許多工具類中都會用到,弄懂它的實現將有利於我們更加深入地理解Java異步操作實現。 在分析它的源碼之

原创 線程間的同步與通信(8)——Semaphore源碼分析

前言 系列文章目錄 Semaphore(信號量)也是常用的併發工具之一,它常常用於流量控制。通常情況下,公共的資源常常是有限的,例如數據庫的連接數。使用Semaphore可以幫助我們有效的管理這些有限資源的使用。 Semaphore的結構

原创 線程間的同步與通信(7)——CyclicBarrier源碼分析

前言 系列文章目錄 上一篇 我們學習了基於AQS共享鎖實現的CountDownLatch,本篇我們來看看另一個和它比較像的併發工具CyclicBarrier。 與CountdownLatch的區別 將count值遞減的線程 在CountDo

原创 線程間的同步與通信(6)——CountDownLatch源碼分析

前言 系列文章目錄 CountDownLatch是一個很有用的工具,latch是門閂的意思,該工具是爲了解決某些操作只能在一組操作全部執行完成後才能執行的情景。例如,小組早上開會,只有等所有人到齊了才能開;再如,遊樂園裏的過山車,一次可以

原创 線程間的同步與通信(5)——ReentrantLock源碼分析

前言 系列文章目錄 上一篇 我們學習了lock接口,本篇我們就以ReentrantLock爲例,學習一下Lock鎖的基本的實現。我們先來看看Lock接口中的方法與ReentrantLock對其實現的對照表: Lock 接口 Reentr

原创 逐行分析AQS源碼(4)——Condition接口實現

前言 本篇文章是基於線程間的同步與通信(4)——Lock 和 Condtion這篇文章寫的,在那篇文章中,我們分析了Condition接口所定義的方法,本篇我們就來看看AQS對於Condition接口的這些接口方法的具體實現。 下文中筆者將

原创 線程間的同步與通信(4)——Lock 和 Condtion

前言 系列文章目錄 前面幾篇我們學習了synchronized同步代碼塊,瞭解了java的內置鎖,並學習了監視器鎖的wait/notify機制。在大多數情況下,內置鎖都能很好的工作,但它在功能上存在一些侷限性,例如無法實現非阻塞結構的加鎖

原创 逐行分析AQS源碼(3)——共享鎖的獲取與釋放

前言 前面兩篇我們以ReentrantLock爲例瞭解了AQS獨佔鎖的獲取與釋放,本篇我們來看看共享鎖。由於AQS對於共享鎖與獨佔鎖的實現框架比較類似,因此如果你搞定了前面的獨佔鎖模式,則共享鎖也就很容易弄懂了。 系列文章目錄 共享鎖與獨佔