《併發程式設計的藝術》 筆記

2022-09-21 04:09:08 字數 2440 閱讀 2475

記錄《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演算法取模,不...