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)死鎖

  1. 有多個(gè)共享資源
  2. 線程鎖定了一個(gè)共享資源,但還沒(méi)有解除鎖定就鎖定了另外一個(gè)共享資源
  3. 各個(gè)線程獲取共享資源的順序不固定

也就是說(shuō),打破上面的三個(gè)情況的任何一個(gè),就可以避免死鎖的發(fā)生。 參考: 《Java多線程設(shè)計(jì)模式》,中國(guó)鐵道出版社,2005,結(jié)城浩


文章來(lái)源:http://localhost/wp2/?p=70