java多執行緒之 死鎖

2021-08-11 15:42:26 字數 2091 閱讀 4939

當兩個或多個執行緒競爭試圖獲取對方持有的同步鎖時,它們都會處於阻塞狀態,除非某個執行緒主動釋放自己所持有的同步鎖,這時,死鎖就出現了。用下面這張圖很好理解:

如圖,執行緒thread1和thread2都有兩個同步方法operation1()、operation2(),operation1()中會呼叫operation2().當某個時候,thread1獲取了a的對像鎖,然後失去了cpu時間片,thread2獲得了cpu時間片,然後thread2獲取了b的物件鎖,然後它又失去了cpu時間片,cpu時間片重新回到thread1,這時候thread1呼叫operation2()並試圖獲取b的物件鎖,但此時thread2持有了b的物件鎖,那麼thread1就會阻塞一直等待thread2的物件鎖釋放。當cpu切換到thread2時,它也試圖獲取a的物件鎖,但此時thread1持有a的物件鎖,並且thread1處於阻塞狀態,一直等待著thread2釋放同步鎖,因此thread1跟thread2就會一直等待對方釋放同步鎖,這時候,死鎖就出現了。

具體示例**:

class

deadlock

public synchronized void decrease()

}class

deadthread01

implements

runnable

@override

public

void run() catch (interruptedexception e)

deadlock[0].add(deadlock[1]);}}

}class

deadthread02

implements

runnable

@override

public

void run() catch (interruptedexception e)

deadlock[1].add(deadlock[0]);}}

}deadlock deadlock1 = new deadlock();

deadlock deadlock2 = new deadlock();

deadthread01 thread01 = new deadthread01(deadlock1,deadlock2);

deadthread02 thread02 = new deadthread02(deadlock2,deadlock1);

new thread(thread01).start();

new thread(thread02).start();

上面**中,deadthread01與deadthread02都呼叫了deadlock的同步方法add()方法,當add()中開始呼叫同步方法decrease()時,由於兩個執行緒都想試圖獲取對方的物件鎖而發生死鎖現象。

死鎖的出現不是很頻繁,一旦出現也不容易發現,復現率也不高,因此並沒有什麼很好的簡單方法去避免死鎖,只能在平時編碼的時候多加注意,避免死鎖的出現。以下兩點是對預防死鎖的建議:

2.鎖超時:試圖為鎖設定超時時間可以避免死鎖的發生,也就是說給鎖設定乙個時間,在這個時間段內,執行緒如果沒有獲取鎖,那麼執行緒就會自動回退,釋放自身持有的鎖。這樣就給了其他執行緒獲取它的鎖的機會,在等待隨機的時間後,第乙個執行緒又會試圖獲取他所需要的鎖,這樣就可以避免死鎖的發生了。但synchronized並沒有給同步鎖設定時間的功能。這個時候我們就可以用lock來同步**了,它可以通過呼叫trylock(long,timeunit)來設定同步的時間段。比如對上面decrease()方法進行改寫成:

reentrantlock lock = new reentrantlock();

public

void

decrease()

這裡我們在需要同步的**臨界區開始處呼叫lock.lock(),在臨界區結束處呼叫lock.unlock(),這樣,包含在他們中間的操作就會變為原子操作。這樣就不會涉及到死鎖的問題。(這段同步**也可以通過lock.trylock()方法來設定同步時間)

好了,關於死鎖的討論就到這裡了。

Java 多執行緒之死鎖

大家可能平時玩電腦,可以同時掛qq啊,玩遊戲啊,開啟文字啊,等等。這裡,我們假設是單塊cpu。也就是俗稱的單核cpu。大家可能會覺得這些軟體,這些執行緒是同時執行的,其實不然,其實在任何一種情況下,電腦都只執行乙個執行緒!只是因為這個單塊的cpu內部為我們劃分了很多很多的時間塊,而這個時間的劃分是以...

多執行緒之死鎖

1 死鎖發生的場景 有時候兩個或者多個執行緒需要訪問同乙份資源,這裡就涉及到執行緒同步的問題 thread1 synchronized object1 thread2 synchronized object2 看看上面的例子,兩個執行緒各自都有想要訪問對方的想法,可是雙方都不願意放手,就像a拿到了開...

多執行緒之死鎖

死鎖。同步中巢狀同步。你有一根筷子,我有一根筷子,我要吃飯,你不給我,我不給你,誰都吃不著飯,死鎖發生,但是死鎖不一會發生,也會存在和諧的狀態,就是你把筷子給我,我吃一口,我再把筷子給你,你再吃一口 class ticket implements runnable else while true s...