記錄《j**a 併發程式設計的藝術》部分知識點
volatile
synchronized
用來闡述記憶體之間的可見性
任意乙個j**a物件,都擁有一組監視器方法(定義在object上),主要包括wait(),nofify(),notifyall()等;這些方法與synchronized同步關鍵字配合可以實現等待/通知模式
condition與lock配合,也可以實現等待/通知模式。
condition前置條件:呼叫lock.lock()獲取鎖或呼叫lock.newcondition()獲取condition物件
呼叫方式是condition.await()。
blockingqueue
常用於生產者和消費者場景
方法/處理方式
丟擲異常
返回特殊值
一直阻塞
超時退出
插入方式
add(e)
offer(e)
put(e)
offer(e,time,unit)
移除方法
remove()
poll()
take()
poll(time.unit)
檢查方法
element()
peek()
不可用不可用
丟擲異常
佇列滿,在插入則會丟擲異常;佇列空,獲取元素則拋異常;
返回特殊值
插入成功返回true,取不到元素則返回null
一直阻塞
佇列滿,阻塞生產者;佇列空,阻塞消費者;
超時退出
生產者對應的佇列滿了,阻塞一段時間後,會退出。
通知模式
大致總結:
宣告notfull和notempty兩個condition物件
put的生產方法裡;會校驗佇列是否滿了,滿了則呼叫await();不滿則insert,insert裡呼叫notempty的signal()
take方法,佇列空,則呼叫await()方法
await()的實現是呼叫了locksupport的park()方法;
part()呼叫了unsafe.park;
圖1
圖2對於圖2
1.如果當前執行的執行緒少於corepoolsize,則建立新執行緒來執行任務需獲取全域性鎖。
2.如果執行的執行緒等於或者多與corepoolsize,則將任務加入blockingqueue
3.如果無法將任務加入blockingqueue(佇列已滿),則建立新的執行緒來處理任務 需獲取全域性鎖。
4.如果建立新執行緒將使當前執行的執行緒超出maximumpoolsize(執行緒池的最大數量),任務將被拒絕,並呼叫rejectedexecution()方法
可核心執行緒數幹活;幹不完放到佇列裡;佇列滿了就找非核心執行緒幹;非核心執行緒幹不過來就執行丟棄策略。
盡可能避免獲取全域性鎖。
new threadpoolexecutor(corepoolsize,maximumpoolsize, keepalivetime, milliseconds, runnabletaskqueue, handler);
1.corepoolsize 執行緒池基本大小;提交乙個任務到執行緒池時,執行緒池會建立乙個執行緒來執行任務,即使還有空閒的執行緒能幹。等到需要執行的任務數大於執行緒池基本大小就不再建立。
若呼叫prestartallcorethreads()方法,執行緒池會提前建立並啟動所有基本執行緒。
2.runnabletaskqueue(任務佇列)阻塞佇列
arrayblockingqueue -- 基於陣列的有界,先進先出
linkedblockingqueue -- 靜態工廠方法 executors.newfixedthreadpool()用的這個佇列
synchronousqueue -- 靜態工廠方法 executors.newcachedthreadpool()用的這個佇列
priorityblockingqueue --具有優先順序的無限阻塞佇列
3.maximumpoolsize 使用了無界佇列,則這個引數就沒用了。
4.rejectedexecutionhandler(飽和策略):佇列和執行緒池都滿了。
shutdown 或 shutdownnow來關閉執行緒池
原理是遍歷工作執行緒,逐個呼叫interrupt方法。
shutdownnow是置執行緒為stop,shutdown是置執行緒為shutdown,
n(cpu數)
cpu密集型任務應配置盡可能小的執行緒 如配置n+1
io密集型不是一直有任務,配置盡可能多的執行緒 如2n
混合型,
增加穩定性,防止記憶體溢位。
Java併發程式設計的藝術 筆記
併發存在的問題 上下文切換耗時,死鎖,軟硬體資源限制 解決方法 減少上下文切換 1.無鎖併發程式設計 讓不同的執行緒處理不同的資料段 將資料id採用hash演算法分配給不同的執行緒 2.cas演算法 compare and set使用jni 3.使用最少執行緒 減少處於waiting狀態的執行緒 j...
Java併發程式設計的藝術 筆記2
現代作業系統排程的最小單位是執行緒,也叫輕量級程序,每個程序可建立多個程序,每個執行緒都有各自的計數器 堆疊和區域性變數等屬性,並且能夠訪問共享變數。處理器在這些執行緒上高速切換,讓使用者感覺到這些執行緒在同時執行。執行緒優先順序 決定執行緒分配處理器資源多少的屬性,設定時,針對頻繁阻塞 休眠或i ...
併發程式設計的藝術(一) 併發程式設計的挑戰
含義 cpu通過給每個執行緒分配cpu時間片實現多執行緒執行 當前任務執行乙個時間片後會切換下乙個任務,但切換前會儲存上乙個任務的狀態,從儲存到載入的過程就是一次上下文切換。但執行緒會有建立和上下文切換的開銷,所以多執行緒不一定快。減少上下文切換方法 無鎖併發程式設計 如id按hash演算法取模,不...