併發程式設計是指多個執行緒同時進行,對同一資源進行操作,那麼就會產生併發問題。如何解決?可以用鎖。synchronized是最常用的,但是有時難免會出現死鎖的現象。
下面就以乙個例項講解死鎖的過程:
假定有乙個分布式微博工具,下面是其後台**。在她的propagateupdate()方法被呼叫時,exampletimingnode類會收到更新,也可以查詢看它是否收到了特定更新。
package com.test.tread;
public
class
microblognode
implements
******microblognode
public string getident()
public
synchronized
void
propagateupdate(update upd_,microblognode backup_)
public
synchronized
void
confirmupdate(microblognode other_,update update_)
}final microblognode local = new microblognode("localhost:8888");
final microblognode other = new microblognode("localhost:8988");
final update first = getupdate("1");
final update second = getupdate("2");
new thread(new runnable()
}).start();
new thread(new runnable()
}).start();
上述中有兩個更新分別傳送給不同的執行緒,每乙個都必須由後備執行緒進行確認,如此看來似乎沒什麼問題,但是實際執行起來就會發生死鎖問題,,每個執行緒都說自己收到了更新,因為每個執行緒在確認方法能夠得到確認之前都要求另乙個執行緒釋放執行緒鎖。
本例中第乙個執行緒以a(propagateupdate),b(confirmupdate)的順序獲得鎖,而第二個執行緒以b,a的方式獲得執行緒鎖,有乙個處理死鎖的技巧:兩個執行緒都已a,b的順序獲得執行緒鎖即可。
兩個執行緒兩把鎖,若是以不同的順序獲得鎖就很有可能發生死鎖現象。
java死鎖例項
在實際程式設計中,要盡量避免出現死鎖的情況,但是讓你故意寫乙個死鎖的程式時似乎也不太簡單,以下是乙個簡單的死鎖例子。package dhp.test1 author 鄧海波 當類的物件flag 1時 t1 先鎖定o1,睡眠500毫秒,然後鎖定o2 而t1在睡眠的時候另乙個flag 0的物件 t2 執...
Java 死鎖的簡單例項
雖然網上有各種關於死鎖的說法,但是卻沒有乙個實際的案例來闡述這個死鎖到底是什麼樣的 那麼這裡有乙個簡單的死鎖例項 執行緒t1需要先使用掃瞄器掃瞄檔案 再使用印表機列印檔案,之後工作完畢 執行緒t2需要先使用印表機列印檔案 再使用掃瞄器掃瞄檔案,之後工作完畢 如果是正常的工作秩序,那應該是t1先擁有掃...
java製造死鎖
package suo public class deadlocktest implements runnable catch exception e synchronized o2 if flag 1 catch exception e synchronized o1 public static ...