1

サーバーにクライアントからのデータを保存しています。すべてのクライアントは独自のスレッドで動作し、1 つのデータ オブジェクトを持っています。
この Data-Object はカスタム クラスです。非特定データを含む Data.java を呼び出します。これは数バイトになる可能性がありますが、通常は約 100kb < Data < 2mb です。
これで、クライアントのリストを反復処理し、Xstream を使用してデータ オブジェクトを xml に解析し、これをデータベースに格納するバックアップ スレッドができました。
しかし、これは安全ですか?
クライアントがバックアップ中にデータを変更する操作を行っている場合 (クライアントが約 0.1 秒ごとに要求を送信し、プロセス中に常にデータを変更する約秒の要求に耐えることができると仮定すると)、このデータは破損している可能性があります。
それを行う良い方法は何ですか?

4

1 に答える 1

2

オブジェクトを変更または読み取るときsynchronizedはいつでも、またはでオブジェクトをロックできます。また、変更するたびに設定されるフラグをLock使用します。そうすれば、バックグラウンドスレッドは変更されたオブジェクトを保存するだけで済みます。boolean dirty;true

クライアントが長期間データを変更している可能性があるlock.tryLock()ため、スレッドがロックされていないオブジェクトを「バックアップ」できるように、ブロックせずにロックを取得できるようにする使用を検討します。次のサイクルでいつでも再試行できます。

class Data{ 
    final Lock lock = new ReentrantLock();
    boolean dirty = false;

    public void setSomething(String a) {
        lock.lock();
        try {
            // modify the Data
            dirty = true;
        } finally {
            lock.unlock();
        }
    }

    public void backupData(Backup backup) {
       if (!lock.tryLock()) return;
       try {
           if (!dirty) return;

           backup.for(this);

           dirty = false;
       } finally {
           lock.unlock();
       }
    }
于 2012-08-09T07:29:45.453 に答える