2010-02-03 90 views
3

我想跟蹤在一個大的代碼庫與收藏一些併發問題。是否有多線程訪問失敗的java收集包裝器/集合?

我想替換所有拋出異常的替代實現集合/地圖時第三線程訪問它(或類似的,我可以看到幾個可能的工作可能strategis)。任何人都知道任何圖書館/工具/策略來做到這一點?

我想這樣做在整個代碼庫搜索替換,只是暫時代替,如「新的HashMap」用不同版本的東西任何引用。但也許有更好的方法?

+0

博士懸崖點擊在Azul系統做了一件對的正是這種在那裏他們有一個下拉更換爲集合上併發訪問的錯誤,但我無法找到的文章(不記得,如果它是一個博客件或不同的表示方法):http://blogs.azulsystems.com/cliff/ – SteveD

回答

2

你可以嘗試來包裝的HashMap的get()和put()方法(或whatelse使用)用的ReentrantLock:

java.util.concurrent.locks.ReentrantLock 



class X { 
private final ReentrantLock lock = new ReentrantLock(); 

    public void m() { 
     if (! lock.tryLock()) { 
      // already locked, hint: lock.isHeldByCurrentThread() ? 
     } 
     lock.lock(); 
     try { 
      // delegate to wrapped hashMap 
     } 
     finally { 
      lock.unlock() 
     } 
    } 
+0

+1一個不錯的解決方案,但會實際需要的併發訪問的情況發生。我認爲我的解決方案將允許我在一個很大程度上未知的代碼庫中探索一般併發使用情況 – krosenvold

2

由於沒有明顯的考生,I made my own

找到29在三個小時內在大型代碼庫上發生潛在的併發問題。