データベースファイルへの同時読み取り/書き込み要求を処理するために何かを書いています。
ReentrantReadWriteLockはうまくマッチしているように見えます。すべてのスレッドが共有RandomAccessFileオブジェクトにアクセスする場合、同時読み取りのファイル ポインターについて心配する必要はありますか? 次の例を検討してください。
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class Database {
private static final int RECORD_SIZE = 50;
private static Database instance = null;
private ReentrantReadWriteLock lock;
private RandomAccessFile database;
private Database() {
lock = new ReentrantReadWriteLock();
try {
database = new RandomAccessFile("foo.db", "rwd");
} catch (FileNotFoundException e) {
e.printStackTrace();
}
};
public static synchronized Database getInstance() {
if(instance == null) {
instance = new Database();
}
return instance;
}
public byte[] getRecord(int n) {
byte[] data = new byte[RECORD_SIZE];
try {
// Begin critical section
lock.readLock().lock();
database.seek(RECORD_SIZE*n);
database.readFully(data);
lock.readLock().unlock();
// End critical section
} catch (IOException e) {
e.printStackTrace();
}
return data;
}
}
getRecord() メソッドでは、複数の同時リーダーで次のインターリーブが可能ですか?
スレッド 1 -> getRecord(0)
スレッド 2 -> getRecord(1)
スレッド 1 -> 共有ロックを取得する
スレッド 2 -> 共有ロックを取得する
スレッド 1 -> レコード 0 をシークする
スレッド 2 -> レコード 1 をシークする
スレッド 1 ->ファイル ポインタでレコードを読み取ります (1)
スレッド 2 -> ファイル ポインタでレコードを読み取ります (1)
ReentrantReadWriteLock と RandomAccessFile を使用して同時実行の問題が発生する可能性がある場合、代替手段は何ですか?