隨筆-59  評論-31  文章-0  trackbacks-0
                死鎖是一個經典的多線程問題,因為不同的線程都在等待那些根本不可能被釋放的鎖,
          從而導致所有的工作都無法完成。假設有兩個線程,分別代表兩個饑餓的人,他們必須共享刀叉并輪流吃飯。
          他們都需要獲得兩個鎖:共享刀和共享叉的鎖。假如線程 "A" 獲得了刀,而線程 "B" 獲得了叉。
          線程 A 就會進入阻塞狀態來等待獲得叉,而線程 B 則阻塞來等待 A 所擁有的刀。
                
                讓所有的線程按照同樣的順序獲得一組鎖。這種方法消除了 X 和 Y 的擁有者分別等待對方的資源的問題。
            將多個鎖組成一組并放到同一個鎖下。前面死鎖的例子中,可以創建一個銀器對象的鎖。于是在獲得刀或叉之前都必須獲得這個銀器的鎖。
            將那些不會阻塞的可獲得資源用變量標志出來。當某個線程獲得銀器對象的鎖時,就可以通過檢查變量來判斷是否整個銀器集合中的對象鎖都可獲得。如果是,它就可以獲得相關的鎖,否則,就要釋放掉銀器這個鎖并稍后再嘗試。
            最重要的是,在編寫代碼前認真仔細地設計整個系統。多線程是困難的,在開始編程之前詳細設計系統能夠幫助你避免難以發現死鎖的問題。
          posted on 2012-12-10 10:54 RoyPayne 閱讀(350) 評論(0)  編輯  收藏 所屬分類: java并發
          主站蜘蛛池模板: 盖州市| 同德县| 永吉县| 邓州市| 浦城县| 泗水县| 庆阳市| 平度市| 仁怀市| 朝阳市| 阳谷县| 临湘市| 定襄县| 宜兴市| 永泰县| 望奎县| 华亭县| 崇礼县| 寻甸| 南开区| 阿克陶县| 龙南县| 应用必备| 大悟县| 长海县| 区。| 德江县| 竹溪县| 城市| 望都县| 巴南区| 昌平区| 林甸县| 新绛县| 许昌市| 洛隆县| 滦平县| 鄂尔多斯市| 同江市| 秭归县| 岑溪市|