多執行緒知識點整理

2021-10-10 01:56:39 字數 1589 閱讀 1952

多執行緒:

多執行緒其實就是指執行緒在同一時間在cpu上同時進行。具體分為兩種模式:一種是指多條執行緒在同乙個cpu上分段時間執行,其實就是並行的意思。一種是多條執行緒在cpu上同時執行的,其實就是併發的意思。

多執行緒的問題

多執行緒主要的問是,在多條執行緒運**況下,會出現以下情況:

1.多個執行緒同時競爭同乙個資源的問題,導致執行緒出現安全問題

2.執行緒之間的呼叫資源互相等待,如下圖:

那麼問題來了,為了避免執行緒安全問題,我們應該如何避免執行緒安全的問題了:

1.進行加鎖操作:就是對多個執行緒要都是使用的資源進行加鎖操作,加鎖的操作有三個個思想方向:

悲觀鎖:所謂的悲觀鎖,其實就是一種悲觀的心態,也就像是你是對什麼事情都報悲觀的看法,認為所有的事 , 不好的影響是一定會發生的,基於這個觀點。所有在對多執行緒中要使用的公共資源,你也認為發生執行緒不安全的問題是一定要發生的,那就先把她加一把鎖上,這樣讓每一來呼叫資源的執行緒,都先看看資源是否在使用、如果已經被其中乙個執行緒使用,其他執行緒就等待。

樂觀鎖:與悲觀的看法不一樣的是,你認為發生不好事情的機率是很小的,所以基於這個觀點,在多執行緒使用公共資源的時候,你認為大多時候,執行緒使用都市安全的,那麼我們在多條執行緒來呼叫資源的時候,就不需要來想悲觀鎖一樣來加把鎖上,而是直接就呼叫。只是看看呼叫的時候,資源的狀態如何就行。其中一種很經典的思路cas(比較替換)就是樂觀鎖的實現。

aba問題

前面說的加鎖的悲觀鎖和樂觀鎖,但是悲觀鎖的效率低,不利於高併發的情況。樂觀鎖的效率高,但是對記憶體的消耗也大,也是乙個不足。那麼有沒有既考慮到效率,有考慮到記憶體的問題了。其實還真有一種鎖。讀寫鎖。

讀寫鎖:

首先要說明,不是所有的讀寫鎖都滿足既考慮到效率,有考慮到記憶體的話,我說的是讀寫鎖中採用共享模式,獨佔模式相結合的,如:    reentrantreadwritelock類,其就是能夠多執行緒讀取資料,寫執行緒的時候是加了鎖的。但是這要先介紹一種思路,aqs,就是同步器的概念。在aqs的,是會有個虛擬先進先出的佇列來裝插入佇列中的執行緒。而且裡面還是雙向鍊錶結構。然後其有有個狀態來表示公共資源。而執行緒對公共資源的使用方式分為兩種。一種是獨享占用,一種共享,其中獨享占用有分為公平競爭和非公平競爭。公平競爭就是先到先得的意思,指先進入佇列的執行緒優先獲取資源;而非公平競爭是指佇列中的執行緒自由競爭資源,誰先獲取到資源,誰就使用。

2.其實保證執行緒安全,也可以不用加鎖的模式。就比如spirng中ioc中生成的物件預設的是單例模式,但是我們可以設定為prototype多利模式;而且針對我們還可以用therdlocal這個類,來對執行緒中公共使用的物件複製,然後使用,只有記得指使用玩之後,將複製的物件刪除,避免記憶體溢位的問題就行。

3.還有比如利用redis中的setnx 來保證執行緒的安全,也是可以的。

多執行緒知識點整理

基本概念 多執行緒程式在較低的層次上擴充套件了多工的概念 乙個程式同時執行多個任務,通常,每乙個任務稱為乙個執行緒,它是執行緒控制的簡稱。可以同時執行乙個以上執行緒的程式稱為多執行緒程式。多程序與多執行緒的區別 每個程序擁有自己的一整套變數,而執行緒則共享資料。相關介面 執行緒的狀態 要獲得乙個執行...

多執行緒知識點整理(一)

多執行緒是為了提高cpu的處理效率,也即提高程式的執行效率而引進的。因為在作業系統中cup,記憶體,硬碟 io裝置 3者之間存在處理速度上的顯著差異這是硬體層面無法解決的矛盾。cpu的處理速度 記憶體 硬碟 io裝置 為了平衡和記憶體之間速度差異cpu中引入了快取,為了能分時復用cpu引入了多執行緒...

多執行緒 執行緒間通訊知識點整理

執行緒間通訊 多個執行緒在處理同一資源,但是任務卻不同。等待 喚醒機制。涉及的方法 1,wait 讓執行緒處於凍結狀態,被wait的執行緒會被儲存到執行緒池中。2,notify 喚醒執行緒池中乙個執行緒 任意 3,notifyall 喚醒執行緒池中的所有執行緒。這些方法都必須定義在同步中。因為這些方...