【问题标题】:Synchronizing searches and modifications同步搜索和修改
【发布时间】:2014-09-27 00:16:56
【问题描述】:

允许从列表(或其他数据结构)上的多个线程进行搜索,但防止对列表的搜索和对不同线程上的列表的编辑交错的好方法是什么?我尝试在搜索和编辑方法中使用同步块,但是当尝试在多个线程中运行搜索时,这可能会导致不必要的阻塞。

编辑:ReadWriteLock 正是我想要的!谢谢。

【问题讨论】:

  • 发布您的代码以阐明您要完成的工作。
  • 使用读写锁。

标签: java multithreading synchronization readwritelock


【解决方案1】:

通常,是的,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;
   }

【讨论】:

  • 如果tryOptimisticRead()调用结果为0,则写锁被另一个线程获取,doSearch()调用无效
猜你喜欢
  • 2018-05-27
  • 1970-01-01
  • 2017-02-26
  • 2014-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-23
  • 1970-01-01
相关资源
最近更新 更多