java - 同步搜索和修改

标签 java multithreading synchronization readwritelock

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

编辑:ReadWriteLock 正是我要找的东西!谢谢。

最佳答案

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

关于java - 同步搜索和修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26070041/

相关文章:

Java - JFrame 全屏按键监听器不起作用

java - 同步块(synchronized block)会锁定整个对象还是单独锁定方法?

ios - 在 API 服务器调用中打印字符串,但不在其外部打印

java - 同步方法以防止 ConcurrentModificationException

linux - 为什么在 Linux 中 spin_lock 和 spin_unlock 之间的中断被禁用?

java - JSTL:从自定义标签获取变量

java - 如何将自定义 getView 绑定(bind)到 ListView 适配器?

java - Spring MVC @RestController -> 无论我做什么,PUTting 结果都是 "400 Bad Request"

java - 从不同线程检查时,ConcurrentLinkedQueue 大小返回零

c - 使用一个信号量实现两个线程的线程同步