原创 JAVA併發包(十二):SynchronousQueue

SynchronousQueue也是阻塞隊列中的一種,它用在線程池中可以讓線程池動態調整線程數量,任務多它就創建多點線程去執行任務,任務少它就會把多餘的線程釋放掉。這在一定程度上提高了併發的吞吐量,但是需要注意的是系統資源是否承受

原创 java集合框架(十一):TreeSet

開發十年,就只剩下這套架構體系了! >>>    TreeSet是可排序不重複的集合,其數據結構是TreeMap(點擊此處瞭解原理),TreeSet的值就存儲在TreeMap的key中。下面就來看看具體實現。 一、類的定義 public

原创 JAVA併發包(三):ReentrantLock

ReentrantLock也叫做可重入鎖,就是拿到鎖的線程可以多次獲得鎖,體現在代碼層面就是可以多次調用lock成功。 一、基本結構 下面是重入鎖基本代碼結構了,Sync繼承了AQS(可以點擊查看之前的博客解讀),然後加鎖和解鎖是

原创 JAVA併發包(五):StampedLock

StampedLock是JDK8新增的API,是讀寫鎖ReentrantReadWriteLock優化版,可以用來避免寫飢餓。它使用版本戳和讀寫模式來控制併發訪問,加鎖會獲得一個版本戳,然後解鎖需要這個版本戳去匹配,匹配上纔可以解

原创 JAVA併發包(九):Executors

Executors就是Executor多了一個s,但是它跟Executor沒有依賴關係。它其實是一個工廠或者說是一個工具類,能夠生產ExecutorService、ScheduleExecutorService、Callable、

原创 excel文件上傳下載問題總結

最近做項目跟excel打交道比較多,很多業務需求涉及到excel文件的上傳、解析和下載,在這個過程中,我們難免會遇到一些棘手的問題。下面我將對這些問題做一個描述,提供出我的解決方案以及思考和總結。 一、斜線的問題 考慮到要用poi

原创 JAVA併發包(四):ReentrantReadWriteLock讀寫鎖

一、前言 這篇文章主要是源碼解讀,幫忙理解讀寫鎖裏面的難點,也是作爲自己對讀寫鎖認識的一個總結。如果要掌握讀寫鎖,看博客是遠遠不夠的,必須回到jar包去品讀源碼,有不懂的地方再來看博客的註釋部分。 二、概述 ReentrantRe

原创 Mockito單元測試的使用

作爲一個java開發,如果不會用mock工具做單元測試是不合格的。mock可以理解爲一個模擬對象,即一個替代者,可以替換掉依賴的對象,這樣一來我們就可以把注意力集中在業務代碼邏輯,驗證自我代碼的正確性。如下圖所示,A類依賴了B類和

原创 JAVA併發包(二):LockSupport

LockSupport是掛起線程的一種實現方式,它不是同步鎖,只是一個提供給同步鎖調用,把當前線程掛起的協助類。它也能夠單獨使用,把某個線程掛起。 一、方法介紹 LockSupport的方法有以下幾個,後面會一個個介紹 1.掛起

原创 JAVA併發包(二十):ConcurrentHashMap

ConcurrentHashMap也是併發環境中常見的Map,如果在高併發中沒有排序等特別的需要,我們可以優先選擇ConcurrenHashMap存儲key-value鍵值對。 ConcurrentHashMap一般有兩個版本的實

原创 JAVA併發包(六):AbstractExecutorService

接下來我們開始研究激動人心的java併發的核心–線程池,併發包裏的很多api都是服務於線程池的,像前面講到AQS,重入鎖,以及後面會講解的阻塞隊列等等,都可以在線程池的源碼中看到。由於線程池設計到的api有多個,我這裏就一步步來講

原创 JAVA併發包(十七):ConcurrentLinkedQueue

ConcurrentLinkedQueue的直接翻譯叫做併發鏈表隊列,它以自旋非阻塞的方式實現隊列的功能,內部維護鏈表結構,沒有容量的限制。可以結合LinkedBlockingQueue原理去理解ConcurrentLinkedQ

原创 JAVA併發包(一):AbstractQueuedSynchronizer

一、簡介 AbstractQueuedSynchronizer簡稱AQS,從名字理解,它是一個抽象隊列同步鎖,是重入鎖、讀寫鎖的基類。如果我們要全面學習java的併發鎖,首先要掌握AQS的加鎖機制。下面文章我將介紹AQS的結構,加

原创 JAVA併發包(十五):ScheduledThreadPoolExecutor

通過之前對線程池和延遲隊列的研究,我們現在來學習ScheduleThreadPoolExecutor(簡稱STPE)就比較輕鬆了。可以把STPE理解爲這樣一個線程池,它裏面的任務可以延遲一次性執行(叫做定時任務),也可以每隔一個週

原创 JAVA併發包(十六):LinkedBlockingDeque

LinkedBlockingDeque是雙端阻塞隊列,它跟LinkedBlockingQueue的區別在於它可以做到後進先出,也就是實現棧的功能,本篇文章我們主要來看看它是如何實現後進先出的。 一、基本代碼結構 從以下代碼結構中可