私はマルチスレッド環境に少し慣れていないので、次の状況に最適なソリューションを考え出そうとしています。
私はデータベースからデータを1日1回午前中に読み取り、そのデータをシングルトンオブジェクトのHashMapに格納します。日中のDB変更が発生した場合にのみ呼び出されるsetterメソッドがあります(これは1日に0〜2回発生します)。
マップ内の要素を返すゲッターもあり、このメソッドは1日に数百回呼び出されます。
HashMapを空にして再作成しているときにゲッターが呼び出され、空の/不正な形式のリストで要素を見つけようとする場合が心配です。これらのメソッドを同期させると、2人のリーダーが同時にゲッターにアクセスできなくなり、パフォーマンスのボトルネックになる可能性があります。書き込みはめったに発生しないので、パフォーマンスの低下をあまり受けたくありません。ReentrantReadWriteLockを使用する場合、書き込みロックが解除されるまで、ゲッターを呼び出す人にキューを強制しますか?複数のリーダーが同時にゲッターにアクセスできるようにしますか?一度に1人のライターのみを強制しますか?
これをコーディングするのは...
private final ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
private final Lock read = readWriteLock.readLock();
private final Lock write = readWriteLock.writeLock();
public HashMap getter(String a) {
read.lock();
try {
return myStuff_.get(a);
} finally {
read.unlock();
}
}
public void setter()
{
write.lock();
try {
myStuff_ = // my logic
} finally {
write.unlock();
}
}