允许从列表(或其他数据结构)上的多个线程进行搜索,但防止在不同线程上对列表进行搜索和对列表进行交错编辑的好方法是什么?我尝试在搜索和编辑方法中使用同步块(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/