リスト (または他のデータ構造) 上の複数のスレッドからの検索を許可するが、リスト上の検索と異なるスレッド上のリストへの編集がインターリーブしないようにする良い方法は何ですか? 検索および編集メソッドで同期ブロックを使用してみましたが、複数のスレッドで検索を実行しようとすると不要なブロックが発生する可能性があります。
編集: 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;
}