0
什麼是允許從列表(或其他數據結構)上的多個線程進行搜索的一種好方法,但是阻止在列表上搜索並且編輯到不同線程上的列表以進行交織?我嘗試在搜索和編輯方法中使用同步塊,但嘗試在多個線程中運行搜索時可能導致不必要的阻塞。同步搜索和修改
編輯:ReadWriteLock正是我正在尋找!謝謝。
什麼是允許從列表(或其他數據結構)上的多個線程進行搜索的一種好方法,但是阻止在列表上搜索並且編輯到不同線程上的列表以進行交織?我嘗試在搜索和編輯方法中使用同步塊,但嘗試在多個線程中運行搜索時可能導致不必要的阻塞。同步搜索和修改
編輯: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;
}
發佈您的代碼以闡明您正在嘗試完成的任務。 – 2014-09-27 00:19:20
使用ReadWriteLock。 – jtahlborn 2014-09-27 01:07:36