多執行緒併發相關的幾個重要基礎知識點解析

2021-09-19 19:58:58 字數 1404 閱讀 3187

問:volatile 變數和 atomic 變數有什麼不同?

答:volatile 變數和 atomic 變數看起來很像,但功能卻不一樣。

volatile 變數可以確保先行關係,即寫操作會發生在後續的讀操作之前, 但它並不能保證原子性,也就是說其可以保證變數的可見性與有序性,無法保證原子性。例如用 volatile 修飾 count 變數,則 count++ 操作就不是原子性的。

atomicinteger 類提供的 atomic 方法可以讓這種操作具有原子性,其保證了併發安全的可見性、有序性、原子性三要素。如 getandincrement() 方法會原子性的進行增量操作把當前值加一,其它資料型別和引用變數也可以進行相似操作。

問:如果你提交任務時執行緒池佇列已滿了則會發會生什麼?

答:這取決於執行緒池佇列的實現。

如果執行緒池使用的是 linkedblockingqueue 無界佇列,則繼續新增任務到阻塞佇列中等待執行理論上是不會滿的,因為 linkedblockingqueue 可以近乎認為是乙個無窮大的佇列,可以無限存放任務。

如果執行緒池使用的是有界佇列(比如 arrayblockingqueue)的話,任務首先會被新增到佇列中,當佇列滿了則會使用拒絕策略 rejectedexecutionhandler 處理滿了的任務,預設是 abortpolicy,我們可以在建立執行緒池時修改這個策略,譬如是靜默忽略還是崩潰等。

問:簡單說說併發飢餓與死鎖的區別?

答:飢餓是指系統不能保證某個程序的等待時間上界,從而使該程序長時間等待,當等待時間給程序推進和響應帶來明顯影響時,稱發生了程序飢餓。當飢餓到一定程度的程序所賦予的任務即使完成也不再具有實際意義時稱該程序被餓死。

死鎖是指在多道程式系統中,一組程序中的每乙個程序都無限期等待被該組程序中的另乙個程序所占有且永遠不會釋放的資源。

他們的相同點是二者都由於競爭資源而引起。

他們的不同點可以從幾個方面來總結:

從程序狀態考慮,死鎖程序都處於等待狀態,忙等待(處於執行或就緒狀態)的程序並非處於等待狀態,但卻可能被餓死;

死鎖程序等待永遠不會被釋放的資源,餓死程序等待會被釋放但卻不會分配給自己的資源,表現為等待時限沒有上界(排隊等待或忙式等待);

死鎖一定發生了迴圈等待,而餓死則不然。這也表明通過資源分配圖可以檢測死鎖存在與否,但卻不能檢測是否有程序餓死;

死鎖一定涉及多個程序,而飢餓或被餓死的程序可能只有乙個;

在飢餓的情形下,系統中有至少乙個程序能正常執行,只是飢餓程序得不到執行機會,而死鎖則可能會最終使整個系統陷入死鎖並崩潰;

本群提供免費的學習指導 架構資料 以及免費的解答

不懂得問題都可以在本群提出來 之後還會有職業生涯規劃以及面試指導

併發基礎 Linux多執行緒程式設計

linux 下的多執行緒程式設計使用pthread posix thread 函式庫,使用時包含標頭檔案pthread.h,鏈結共享庫libpthread.so。這裡順便說一下gcc鏈結共享庫的方式 l用來指定共享庫所在目錄,系統庫目錄不用指定。l用來指定要鏈結的共享庫,只需要指定庫的名字就行了,如...

多執行緒基礎 Java併發1

目錄 執行緒和程序概念 同步和非同步概念 多執行緒建立方式 繼承thread類 不推薦 實現runnable介面,重寫run方法 使用匿名內部類 多執行緒的執行狀態 守護執行緒 非守護執行緒 join方法 優先順序執行緒安全 同步方式 同步 塊 同步方法 注意 class threaddemo1 e...

個人知乎 基礎四 多執行緒

threadlocal 執行緒本地變數,每個執行緒有乙個副本 執行緒安全變數 atomicinteger new atomicinteger 0 blockingqueue 執行緒池 減少執行緒建立銷毀開銷 單執行緒excutor executorservice service excutors.n...