以下是我私人的Memo,由於時間問題排版有點散漫,過段時間會整理好。
ConcurrentHashMap//分段鎖 Segment
CopyOnWriteArrayList//寫入時複製 會出現髒數據 使用ReentrantLock實現CopyOnWriteArraySet//基於CopyOnWriteArrayList實現 唯一不同在於add時調用CopyOnWriteArrayList的addIfAbsent()方法
ArrayBlockingQueue//offer和put一把鎖 take和poll一把鎖 兩把鎖避免了讀寫競爭
ConcurrentLinkedQueue
PriorityQueue//非線程安全
ConcurrentSkipListMap/ConcurrentSkipListSet//分別是SortedMap和SortedSet的併發代替容器
LinkedBlockingQueue
ArrayBlockingQueue
SynchronousQueue
AtomicInteger//Integer的原子封裝類
incrementAndGet()//線程安全 本質是CAS鎖
public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,
BlockingQueue<Runnable> workQueue,ThreadFactory threadFactory,RejectedExecutionHandler handler);
corePoolSize:核心池大小 maximumPoolsize:線程池最大線程個數 KeepAliveTime:線程多久沒有任務終止直到線程個數不大於核心池個數 BlockingQueue 阻塞隊列
execute(Runnable)
RejectedExecutionHandler的實現:線程池中線程個數大於最大線程數後1、CallerRunsPolicy由調用這線程來執行 2、AbortPolicy 拋出RejectedExecutionException 3、DiscardPolicy不做任何動作 4、DiscardOldestPolicy 拋棄要執行的最後一個Runnable任務
newFixedThreadPool(int) 固定大小的線程池 阻塞隊列爲LinkedBlockingQueue 隊列中task個數超出整型最大值拋出RejectedExecutionException
newSingleThreadExecutor() 大小爲1的線程池 task只能同時被執行一個 其他都在阻塞隊列LinkedBlockingQueue
newCachedThreadPool() 核心池大小爲0 最大線程爲Integer.MAX_VALUE 阻塞隊列爲SynchronousQueue task任務超出上限拋出RejectedExecutionException 線程存活1min
newScheduledThreadPool(int) 最大線程個數爲Integer.MAX_VALUE 阻塞隊列爲DelayedWorkQueue keepAliveTime爲0
注意這個與Timer比的優勢(Timer單線程、Timer存在線程逃逸、不能像線程池一樣合理利用Callable)
FutureTask 用於要異步獲取執行結果或者執行任務場景 傳入Runnable和Callable的任務給FutureTask 調用get阻塞方法獲取執行結果
FutureTask可以確保即使調用了多次run方法,也只會執行一次Runnable或者Callable任務 或者通過cancel取消FutureTask地執行
CountDownLatch 併發包提供地一個控制多個線程同時開始某動作的類,方式爲減數
await() 判斷計數是否爲0 爲0直接返回 否則進入隊列進行等待 直到計數爲0 或者線程被interrupt
countdown() 使用CAS將計數減1 之後等於0返回true 不然返回false
CyclicBarrier
基於ReentrantLock 和 Condition實現
當await的線程個數到達設定數量才繼續往下執行。
await()首先加鎖 然後count屬性減1 減爲0 執行傳入的Runnable
ReentrantLock
併發包提供的一個更方便的控制併發資源的類 和synchronized效果一致
ReentrantLock()
lock() 基於CAS的鎖
unlock()釋放鎖
Condition
Condition是併發包中提供的一個接口,典型的實現有ReentrantLock,ReentranLock提供了一個newCondition方法,以便用戶在同一個鎖的情況下可以根據不同的情況執行等待或者喚醒動作。
ReentranLock.newCondition創建一個AQS的內部類ConditionObject的對象實例
ReentrantLock.newCondition().await() 將此線程加入此condition的等待隊列,將線程置爲等待狀態。
ReentrantLock.newCondition().signal() 從等待隊列中取出一個線程 喚醒 signalAll方法可喚醒全部
ReentrantReadWriteLock
ReentrantReadWriteLock和ReentrantLock沒有任何繼承關係。這個類提供了讀鎖和寫鎖。讀寫鎖分離使得讀多寫少的場景大幅度提升讀的性能。
這個類通過AQS實現