閉鎖:想實現它管理的執行緒都執行完後,在執行其它執行緒。例子:鍋和菜買回來之後,才可以輸出開始做飯在呼叫構造方法建立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 存在這樣一種資源,它在某個時刻只能被分配給...