執行緒相關 鎖

2021-08-10 15:38:58 字數 3308 閱讀 1058

閉鎖:想實現它管理的執行緒都執行完後,在執行其它執行緒。

在呼叫構造方法建立countdownlatch物件時需要指定管理執行緒的個數(計數器的值)。

await():會產生阻塞,直到計數器減為0的時候才會釋放。

countdown():每呼叫一次,會將計數器–。

例子:鍋和菜買回來之後,才可以輸出開始做飯

//兩個執行緒類

class buyguo implements runnable

public

void

run()

}class buycai implements runnable

public

void

run()

}//主方法

public

static

void

main(string args) catch (interruptedexception e)

system.out.println("開始做飯...");

}

也需要在建立時確定管理執行緒個數,await()方法是加法了,產生阻塞並且計數器加一,當加到管理執行緒的個數時,釋放阻塞。

public

class

democyclicbarrier

}class horse1 implements runnable

public

void

run() catch (interruptedexception e) catch (brokenbarrierexception e)

system.out.println("第一匹馬開始比賽...跑起");

}}class horse2 implements runnable

public

void

run() catch (interruptedexception e)

system.out.println("第二匹馬來到了起跑線,準備好...");

try catch (interruptedexception e) catch (brokenbarrierexception e)

system.out.println("第二匹馬開始比賽...跑起");

}}//兩匹馬同時起跑~~

countdownlatch和cyclicbarrier的主要聯絡和區別如下:(這段**千山獨行大大的部落格~)

1.閉鎖countdownlatch做減計數,而柵欄cyclicbarrier則是加計數。

2.countdownlatch是一次性的,cyclicbarrier可以重用。

3.countdownlatch強調乙個執行緒等多個執行緒完成某件事情。cyclicbarrier是多個執行緒互等,等大家都完成。

4.鑑於上面的描述,cyclicbarrier在一些場景中可以替代countdownlatch實現類似的功能。

public

class

demoexchanger

}class spy1 implements runnable

public

void

run() catch (interruptedexception e)

}}class spy2 implements runnable

public

void

run() catch (interruptedexception e)

}}

之前執行緒安全問題需要解決,都會用synchronized同步**塊,這個方法我們還需要指定鎖的鑰匙,不夠靈活。

synchronized:

假設切換執行緒時,執行緒1執行一次,然後等待,喚醒執行緒2,執行緒2執行。這期前假設執行時間1s,喚醒時間2秒。那麼執行2次的時間一共是4秒。

lock:lock在喚醒期間,如果執行緒2沒醒會多次執行,執行緒1執行1秒後,執行緒2處再喚醒中,那麼執行緒1會在喚醒的2秒中繼續執行2次,等執行緒2喚醒後,執行緒2執行。那麼4秒的時間一共執行了4次。

lock**具體如下:

public

class

testdemo3

}class readrunner3 implements runnable

public

void

run()

}}class writerunner3 implements runnable

public

void

run()else

lock.unlock();}}

}

讀寫鎖readwritelock

讀寫鎖分為讀鎖和寫鎖,與lock的區別就是,讀鎖和讀鎖之間可以共存,如果是對一條資料的多個請求的讀操作,不會進行鎖定,但是讀鎖和寫鎖,寫鎖和寫鎖會被鎖定。

**公升級:

public

class

testdemo4

}class readrunner4 implements runnable

public

void

run()

}}class writerunner4 implements runnable

public

void

run()else

lock.writelock().unlock();}}

}

如果設定乙個靜態成員變數,2個執行緒分別從1加到100000,那麼結束後輸出最後的結果,會是多少呢?

會是200000嘛?不會,因為執行緒安全沒有任何措施,導致會有重複的相加,即兩個執行緒同時加完後結果只加了1.而不是加2.

新增synchronized同步**塊或鎖可以解決該問題,我們還有別的解決方案,原子性atomicinteger

public

class

demoatomic catch (interruptedexception e)

system.out.println(num);

}}class addrunner implements runnable

public

void

run()

cdl.countdown();

}}

其原始碼的邏輯是每次加完後會進行安全檢查,如果發現重複相加則再加一次,直至沒有重複相加。

關於執行緒鎖的相關

1.互斥鎖 遞迴鎖 linuxthreads只支援一種互斥體屬性 互斥體的型別,fast型別的互斥體值為pthread mutex fast np,recursive型別的互斥體值為pthread mutex recursive np,error checking型別的互斥體值為pthread mu...

Linux多執行緒,鎖的相關問題

為實現保護共享資源而提出一種鎖機制。其實,自旋鎖與互斥鎖比較類似,它們都是為了解決對某項資源的互斥使用。無論是互斥鎖,還是自旋鎖,在任何時刻最多只能有乙個保持者,即任何時刻最多只能有乙個執行單元獲得鎖。但是兩者在排程機制上略有不同。對於互斥鎖,如果資源已經被占用,資源申請者只能進入睡眠狀態。但是自旋...

執行緒鎖與避免執行緒鎖 執行緒鎖檢測

程序是資源共享的,執行緒是資源私有的。死鎖的四個必要條件 在計算機專業的本科教材中,通常都會介紹死鎖的四個必要條件。這四個條件缺一不可,或者說只要破壞了其中任何乙個條件,死鎖就不可能發生。我們來複習一下,這四個條件是 互斥 mutual exclusion 存在這樣一種資源,它在某個時刻只能被分配給...