“嗨,阿米戈!”

“在我之前的課程中,我有時會使用‘互斥鎖’和‘監控器’這兩個詞,現在是時候告訴你它們的意思了。”

“我洗耳恭聽。”

互斥量是一個用於同步線程/進程的特殊對象。它有兩種可能的狀態:忙碌和空閒。簡單來說,互斥量是一個布爾變量,可以有兩個值:忙碌(真)和空閒(假)。”

“當一個線程想要獲得一個對象的所有權時,它將對象的互斥量標記為忙碌。當它完成對對象的處理後,它將其互斥量標記為空閒。”

“換句話說,互斥量就像門上的‘忙碌/空閒’標誌?”

“是的。而且這樣的互斥量與 Java 中的每個對象相關聯。只有 Java 機器才能直接訪問互斥量。它對程序員是隱藏的。”

“那我們怎麼用呢?”

“在 Java 中,我們可以通過監視器使用互斥量。”

“監視器是一種特殊的機制(一段代碼),位於互斥量之上。它保證與互斥量的正確交互。將對象標記為忙碌是不夠的。仍然有必要確保其他線程不會嘗試使用忙碌的對象。”

“在 Java 中,監視器是使用關鍵字 synchronized 實現的。”

“當你寫一個同步塊時,Java 編譯器用三段代碼替換它:”

1)在 synchronized 塊的開頭,添加了將互斥體標記為繁忙的代碼。

2) 在同步塊的末尾,添加了將互斥體標記為空閒的代碼。

3) 在同步塊之前,添加代碼,如果互斥鎖忙,則導致線程等待直到互斥鎖被釋放。

“大致是這樣的:”

代碼 怎麼運行的 描述
synchronized(object)
{

object.doJob();

}
while (object.mutex)
Thread.sleep(1);

object.mutex = true;

object.doJob();

object.mutex = false;

只要互斥量處於忙碌狀態,線程就會休眠
(當互斥量被釋放時我們就退出循環)。 將互斥體標記為忙碌。

執行 doTask();

將互斥量標記為空閒

“實際上,那裡的邏輯是不同的,也更複雜。但這只是細節。”

“我可以知道詳情嗎?”

“在你學會如何正確使用它之前,沒有必要糾結於細節。”

“在幾個關卡之前,我給了你一個帶有轉換箭頭的所有線程狀態的列表和一個影響該狀態的方法列表。你還記得很多嗎?”

“不是真的。我只是很快就忘記了一切……”

“你做的練習越少,你從理論中獲益就越少。”

“到 40 級時,你將學會如何使用所有這些,我將解釋所有這些實際上是如何工作的。與此同時,只要學會正確使用它就可以了。明白了嗎?”

“是的,謝謝你,艾莉。”