2014-09-27 92 views
0

什么是允许从列表(或其他数据结构)上的多个线程进行搜索的一种好​​方法,但是阻止在列表上搜索并且编辑到不同线程上的列表以进行交织?我尝试在搜索和编辑方法中使用同步块,但尝试在多个线程中运行搜索时可能导致不必要的阻塞。同步搜索和修改

编辑:ReadWriteLock正是我正在寻找!谢谢。

+0

发布您的代码以阐明您正在尝试完成的任务。 – 2014-09-27 00:19:20

+1

使用ReadWriteLock。 – jtahlborn 2014-09-27 01:07:36

回答

5

通常,是的ReadWriteLock已经足够了。

但是,如果您使用的是Java 8,则可以通过新的StampedLock获得性能提升,从而避免读取锁定。这适用于与写入(编辑)相比您有更频繁的读取(搜索)的情况。

private StampedLock sl = new StampedLock(); 

public void edit() { // write method 
    long stamp = sl.writeLock(); 
    try { 
     doEdit(); 
    } finally { 
     sl.unlockWrite(stamp); 
    } 
}  

public Object search() { // read method 
    long stamp = sl.tryOptimisticRead(); 
    Object result = doSearch(); //first try without lock, search ideally should be fast 
    if (!sl.validate(stamp)) { //if something has modified 
     stamp = sl.readLock(); //acquire read lock and search again 
     try { 
      result = doSearch(); 
     } finally { 
      sl.unlockRead(stamp); 
     } 
    } 
    return result; 
    }