有條件的同步方法

          ??? 在做多線程程序時我們可能要對某段代碼的同步是有條件的,只有對滿足同一條件的請求才排隊訪問,對與不滿足這樣條件的請求可以并發訪問,在處理這樣的需求的時候我們可以容易的想到,對于這個特定的條件做一個抽象,讓它作為我們同步鎖。下面的代碼可以說明這個處理過程:
          ?1?
          ?2?//?定義鎖
          ?3?private?Map?locks?=?new?HashMap();
          ?4?private?Object?getLock(Object?key)?{
          ?5?????synchronized?(locks)?{
          ?6?????????if?(!locks.containsKey(key))?{
          ?7?????????????locks.put(key,?new?Object());
          ?8?????????}
          ?9?????????return?locks.get(key);
          10?????}
          11?}
          12?
          13?//?需要同步的代碼
          14?synchronized?(getLock(id))?{
          15?????//?TODO
          16?}
          17?
          18?

          posted on 2006-10-09 14:27 Xueping Yang 閱讀(1265) 評論(6)  編輯  收藏 所屬分類: 技術文章

          評論

          # re: 有條件的同步方法 2006-10-09 16:28 GHawk

          Java 5開始內置的java.util.concurrent.locks包里面有pthread-like的Lock和Condition,很方便。  回復  更多評論   

          # re: 有條件的同步方法 2006-10-09 17:54 Xueping Yang

          @GHawk
          對于我的這個需求來說,上面的代碼可能已經是最簡單的呢,要是用concurrent的話必須要tiger啦。  回復  更多評論   

          # re: 有條件的同步方法 2006-10-09 19:41 stoneshao

          呵呵,有意思,畢竟現在的應用服務器都是在jdk1.4下,不能用tiger  回復  更多評論   

          # re: 有條件的同步方法 2006-10-09 19:42 stoneshao

          但是有一個專門做線程同步的包:concurrent.jar,沒有仔細研究它的實現,應該有類似的實現  回復  更多評論   

          # re: 有條件的同步方法 2006-10-09 22:36 Alex

          上面的所有方法都是同步的,什么時候不同步,代碼里體現了么?
          synchronized (getLock(id)) {
          15 // TODO
          16 }
          是同步的,它調用的getLock(id)里面也都是同步的,除非在方法
          synchronized (locks) {}的外面再加一個其他條件的代碼才能算是吧?

          還是你省略了這些代碼?  回復  更多評論   

          # re: 有條件的同步方法 2006-10-10 10:10 GHawk

          @stoneshao
          util.concurrent 的確有一個backport可以在1.4jvm上使用
          http://dcl.mathcs.emory.edu/util/backport-util-concurrent

          自己實現多線程的東西還是比較容易出現問題的,debug和性能分析都可能花費大量的時間,個人感覺還是用現有的庫更容易一些。  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          <2006年10月>
          24252627282930
          1234567
          891011121314
          15161718192021
          22232425262728
          2930311234

          統計

          常用鏈接

          留言簿(1)

          隨筆分類

          隨筆檔案

          文章分類

          技術

          朋友

          搜索

          最新評論

          主站蜘蛛池模板: 黔南| 肥西县| 横山县| 陵水| 城口县| 孟州市| 桂林市| 瓮安县| 沙湾县| 星座| 措美县| 长武县| 连平县| 潢川县| 柘城县| 沁水县| 红原县| 溧水县| 海晏县| 长垣县| 保德县| 措勤县| 大田县| 双江| 丽水市| 黔西县| 洛浦县| 肇州县| 胶南市| 洪雅县| 朝阳区| 崇文区| 临猗县| 肃宁县| 柳河县| 汾西县| 商洛市| 庆城县| 浪卡子县| 普兰县| 宁阳县|