ほとんどの場合、読み書きロックを使用するだけで十分だと思います。
次のように書いたとします。
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class MyDatabase extends SQLiteOpenHelper
{
private static final ReadWriteLock rwLock = new ReentrantReadWriteLock(true);
private static void beginReadLock()
{
rwLock.readLock().lock();
}
private static void endReadLock()
{
rwLock.readLock().unlock();
}
private static void beginWriteLock()
{
rwLock.writeLock().lock();
}
private static void endWriteLock()
{
rwLock.writeLock().unlock();
}
次に、次のようにタスクを実行できます。
public static void doSomething()
{
SQLiteDatabase sldb = null;
try
{
beginReadLock();
MyDatabase mydb = new MyDatabase();
sldb = mldb.getReadableDatabase();
......
}
catch (Exception e)
{
......
}
finally
{
if (sldb != null)
{
try
{
sldb.close();
}
catch (Exception e) {}
}
endReadLock();
}
}
beginReadLock()とendReadLock( )で読み取り操作を囲みます。同様に、書き込み操作をbeginWriteLock()とendWriteLock( ) で囲みます。
数か月前、上記のソリューションにより、複数のスレッドがデータベースを同時に読み取り/書き込みオープンしようとしていた私自身のデータベース ロックの問題を解決できました。