2

シングルトンを使用して、システムで同時に発生するすべてのイベントを記録します。

public class Singleton {
  private static Lock dbLock;
  protected Singleton() {}
  private static class SingletonHolder { 
      private final static Singleton instance = new Singleton();
  }
  public static Singleton getInstance() {
      return SingletonHolder.instance;
  }
  public void recordEvent(Event ev) {
       dbLock.lock();
    try {
          database.insert(ev);
        } finally {
         dbLock.unlock();
    }
  }
  public File lockAndGetDB() {
      dbLock.lock();
      return database.getFile();
  }
  public void unlockDB() {
      dbLock.unlock();
  }
}

数時間ごとに、録画イベントをロックして、インターネット経由でデータベースを送信したいと考えています。

file = Singleton.getInstance().lockAndGetDB();
try {
  sendViaHTTP(file);
}
finally {
   Singleton.getInstance().unlock();
}

デッドロックの可能性はありますか? スレッドセーフですか?

編集済み。(HTTP経由で送信するために試してみてください/最終的に追加されました) しかし、これは主な問題ではありません. 問題は、dLock.lock(); を待機しているスレッドがあるかどうかです。recordEvent(Event ev) は私の Singleton.getInstance().unlock(); です。getInstance() コードを入力してロックを解除できますか?

4

2 に答える 2

1

ほとんどの場合、はい、デッドロックが発生する可能性があります。またはの実行中にエラーが発生した場合はどうなりますdatabase.getFilesendViaHTTP? try/finally確実Lock.unlockに呼び出されるパターンはありません。

于 2012-10-05T23:41:11.823 に答える
0

異なる順序でロックを取得すると、デッドロックが発生します。ここには実際のロックが 1 つしかないため、問題は発生しません。

あなたのケースは、読み取り/書き込みロックの候補のように見えます.読み取りロックを使用して、DBMS操作の最大同時実行を許可し、書き込みロックを停止してファイルを送信する場合に使用します。

于 2012-10-05T23:40:27.527 に答える