Single Threaded Execution模式的核心就是single,即某個(gè)共享資源同時(shí)只能被某一個(gè)線程訪問(wèn)。可以做如下比喻來(lái)理解這個(gè)模式:門(mén)(共享資源),人(線程)。一個(gè)門(mén)一次只能由一個(gè)人通過(guò)。如果一個(gè)人正在通過(guò)這個(gè)門(mén),那么其他人只能等待了。 當(dāng)然,共享資源中某些方法是線程安全的(SafeMethod),就不用考慮多個(gè)線程同時(shí)調(diào)用的情況了。只有對(duì)不安全的方法(UnsafeMethod)才需要考慮多線程訪問(wèn)的問(wèn)題。 可以對(duì)Single Thread Execution模式這樣理解:如果另外的線程也行執(zhí)行被保護(hù)的UnsafeMethod,那么就需要判斷是否有其他線程正在執(zhí)行被保護(hù)的UnsafeMethod。如果有,則等待;沒(méi)有,則執(zhí)行。 對(duì)Single Threaded Execution Pattern來(lái)說(shuō),代碼的典型表現(xiàn)形式就是對(duì)所有的UnsafeMethod方法加上synchronized關(guān)鍵字。如:
class A{
public void safeMethod(){ }
public synchronized void unsafeMethod1(){ }
publi synchronized void unsafeMethod2(){ }
}
當(dāng)下面的情況發(fā)生時(shí),可能會(huì)出現(xiàn)死鎖
- 有多個(gè)共享資源
- 線程鎖定了一個(gè)共享資源,但還沒(méi)有解除鎖定就鎖定了另外一個(gè)共享資源
- 各個(gè)線程獲取共享資源的順序不固定
也就是說(shuō),打破上面的三個(gè)情況的任何一個(gè),就可以避免死鎖的發(fā)生。 參考: 《Java多線程設(shè)計(jì)模式》,中國(guó)鐵道出版社,2005,結(jié)城浩
文章來(lái)源:
http://localhost/wp2/?p=70