是否有任何java集合包装/集合在多线程访问时失败?

时间:2010-02-03 09:00:59

标签: java collections concurrency

我正在尝试在大型代码库中跟踪与集合相关的一些并发问题。

我想用一个替代实现来替换所有的集合/映射,当第三个线程访问它时会抛出异常(或类似的;我可以看到几个可能有效的策略)。有人知道这样做的任何图书馆/工具/策略吗?

我正在考虑在整个代码库中进行搜索替换,并暂时用不同的版本替换对“new HashMap”等内容的任何引用。但也许有更好的方法?

2 个答案:

答案 0 :(得分:2)

你可以尝试用ReentrantLock包装HashMap get()和put()方法(或者你使用的方法):

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()
         }
     }

答案 1 :(得分:2)

由于没有明显的参与者,I made my own

在大型代码库中,在三小时内发现了29个潜在的并发问题。