多執行緒中的互鎖現象

2021-07-04 08:11:01 字數 1702 閱讀 7167

在多執行緒中經常會出現執行緒間的互鎖現象。

程序間的互鎖,假設有兩個執行緒,執行緒1的完成需要用執行緒2 的資源,執行緒2的完成需要用執行緒1的資源。當兩個執行緒都啟動後,執行緒1 等待執行緒2 的資源, 執行緒2 等待執行緒1 的資源,以致於兩個執行緒都沒辦法完成,都在等待狀態。這種現象就叫做執行緒間的互鎖。

//執行緒1 

public

class

lockrunnable1

implements

runnable catch (interruptedexception e)

system.out.println("我在等你把lock2給我!");

synchronized (lock2)

}

}}//執行緒2

public

class

lockrunnable2

implements

runnable catch (interruptedexception e)

system.out.println("我在等你把lock1給我!");

synchronized (lock1)

}

}}//測試

public

class

testrunnable

}

執行結果:

從結果中可以看到,程式一直在執行。因為紅色圓圈處一直處於執行狀態!

可以通過呼叫同步鎖的wait()和notify()方法來解決互鎖問題。

首先說一下wait()方法,wait()方法必須用在同步鎖中。呼叫wait()方法,執行緒進入等待狀態,直到有notify()喚醒它。

nitify()方法同樣也需要用在同步鎖中。作用是將在等待狀態的程序喚醒,進入執行狀態。

//執行緒1

public

class

lockrunnable1

implements

runnable catch (interruptedexception e)

system.out.println("run1釋放lock1, 進入等待狀態!");

try catch (interruptedexception e)

system.out.println("run1在等你把lock2給我!");

synchronized (lock2)

}

}}//執行緒2

public

class

lockrunnable2

implements

runnable catch (interruptedexception e)

system.out.println("run2在等run1把lock1給他!");

synchronized (lock1) catch (interruptedexception e)

system.out.println("run2 執行完畢!");

}}

}}//測試

public

class

testrunnable

}

多執行緒飢餓現象,飢餓與死鎖區別

飢餓是指系統不能保證某個程序的等待時間上界,從而使該程序長時間等待,當等待時間給程序推進和響應帶來明顯影響時,稱發生了程序飢餓。當飢餓到一定程度的程序所賦予的任務即使完成也不再具有實際意義時稱該程序被餓死。死鎖是指在多道程式系統中,一組程序中的每乙個程序都無限期等待被該組程序中的另乙個程序所占有且永...

一例JAVA多執行緒訪問卡死的現象

起名?manager顯然不合適,叫worker最好。queue cache都不是太適合。資料佇列linkedblockingdeque,快取用concurrentlinkedqueue。派發資料,當然要用執行緒。否則一阻塞就誤事了。收到資料後,先在快取中查詢,找到合適的就從快取中刪除 沒有合適的新建...

python中的多執行緒是假的多執行緒

python中的多執行緒是假的多執行緒?為什麼這麼說,我們先明確乙個概念,全域性直譯器鎖 gil global interpreter lock python 的執行由python虛擬機器 直譯器 來控制,同時只有乙個執行緒在執行 對python虛擬機器的訪問由全域性直譯器鎖 gil 來控制,正是這...