原创 JUC源碼解析-阻塞隊列-迭代器(一)

本篇來分析下阻塞隊列裏迭代器的實現,以ArrayBlockingQueue源碼來分析。 首先在開始前想一想,如何實現阻塞隊列的迭代器功能? 在併發下有些線程在讀,有些在改,還有些在使用迭代器遍歷,怎麼確保安全性?用獨佔鎖將這些操作

原创 JUC源碼解析-阻塞隊列-SynchronousQueue

SynchronousQueue 是一個同步阻塞隊列,它的每個插入操作都要等待其他線程相應的移除操作,反之亦然。SynchronousQueue 像是生產者和消費者的會合通道,它比較適合“切換”或“傳遞”這種場景:一個線程必須同步

原创 JUC源碼解析-阻塞隊列-迭代器(二)

接着上一篇,分析的是ArrayBlockingQueue的實現。 4,刪除 Itr#remove public void remove() { // assert lock.getHoldC

原创 JUC源碼解析-阻塞隊列-PriorityBlockingQueue

PriorityBlockingQueue 需要對堆排序有了解,推薦 排序六 堆排序 PriorityBlockingQueue 底層是個最小堆。當存儲元素的數組滿時插入操作不會阻塞,而是擴容數組;數組空時 take 方法阻塞。

原创 JUC源碼解析-阻塞隊列-DelayQueue

DelayQueue是一個支持延時獲取元素的無界阻塞隊列。隊列使用PriorityQueue來實現。隊列中的元素必須實現Delayed接口,在創建元素時可以指定多久才能從隊列中獲取當前元素。只有在延遲期滿時才能從隊列中提取元素。我

原创 JUC源碼解析-阻塞隊列-LinkedBlockingQueue與ArrayBlockingQueue

什麼是阻塞隊列? 阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列。這兩個附加的操作是: 在隊列爲空時,獲取元素的線程會阻塞等待,直到隊列變爲非空或超時。 當隊列滿時,存儲元素的線程會等待隊列可用。 阻塞隊列

原创 JUC源碼解析-ConcurrentHashMap1.8

前言 1.8後的ConcurrentHashMap與之前有截然不同的設計,之前是分段鎖的思想,通過採用分段鎖Segment減少熱點域來提高併發效率。1.8利用CAS+Synchronized來保證併發更新的安全,底層採用數組+鏈表+紅黑樹

原创 LeetCode動態規劃題

斐波那契數列類 LeetCode70. Climbing Stairs 題目描述:有 N 階樓梯,每次可以上一階或者兩階,求有多少種上樓梯的方法。 dp[ i ] = dp[ i-1 ] + dp[ i-2 ]; public

原创 BeanDefinitionRegistryPostProcessor與動態代理配合使用例子

實現這樣一種功能: 自定義了一個註解@MyReference, @Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME) public @interface My

原创 數組相關算法題

128.:Longest Consecutive Sequence 給定一個未排序的整數數組,找出最長連續序列的長度。 要求是O(n),所以不能使用排序,那麼就得考慮輔助。利用Map,key爲num,value爲其連續長度,每次之

原创 HashMap源碼解析-紅黑樹操作

距離上一篇分析HashMap的文章已經過去一年了,今天偶爾翻到之前的那篇,還記得當時是打算另起一篇來分析鏈表的樹化,以及樹的鏈表化過程,結果這一拖就😓😓😓,還是來把坑填上吧,畢竟要有始有終。 在我看來HashMap大致分爲三個部分

原创 關於Arrays.asList的坑

今天刷算法時遇到一個 Arrays.asList 的使用問題 int[] arr0 = {2,5,6,7,1283}; List list0 = Arrays.asList(arr0);

原创 記錄些有意思的算法題

將自己刷題中遇到的有意思的,有巧妙解法的題記錄在這,持續更新… LeetCode 338. Counting Bits 給定一個非負整數 num。對於 0 ≤ i ≤ num 範圍中的每個數字 i ,計算其二進制數中的 1 的數目

原创 JUC源碼解析-ConcurrentSkipListMap

單線程下若想使用有序的鍵值對,我們選用 TreeMap,若是考慮到線程安全問題,則可以使用 ConcurrentSkipListMap,它與ConcurrentSkipListSet之間的關係就如 TreeMap 與 TreeSet

原创 EventLoop和線程模型

這是《Netty實戰》,《Netty權威指南》的讀書筆記。 線程模型確定了代碼的執行方式,所以理解所採用的併發模型的影響很重要。 線程池緩存和重用 Thread 極大地提高了性能,但它並不能消除由上下文切換所帶來的開銷,隨着線程數量的