0

cronのようなジョブを使用してデータセットを更新するアプリケーションがあります。更新プロセスは1分に1回行われ、長くは続きません。サーブレットは、このデータセットをユーザーに公開します。私の問題は、更新プロセス中に、サーブレットリクエストがブロックされ、プロセスが完了するのを待つ必要があることです。

結論として、私には次の2つの機能があります。

private void updateData() {    
}

public List getData() {
}

最初の関数は1分に1回実行されます。2つ目は、同時に何度でも呼び出すことができます。updateDataが実行されると、getDataのすべての呼び出しはそれが完了するのを待つ必要があります。1回のgetData呼び出しで、同じ関数の後続の呼び出しをブロックしないでください。updateData関数は、getDataよりも優先度が高くなります。つまり、updateDataを実行する場合、getDataのすべての呼び出しが完了するまで待機する必要がありますが、新しい呼び出しの開始は許可されません。

このような場合、どの同期メカニズムを使用する必要がありますか?私はJavaサーバーを使用していますが、他のプラットフォームにもどのようなソリューションが存在するのか知りたいと思います。

4

4 に答える 4

5

同期の代わりにReadWriteLockを使用できます。

ReadWriteLock は、関連付けられたロックのペアを維持します。1 つは読み取り専用操作用で、もう 1 つは書き込み操作用です。読み取りロックは、ライターがない限り、複数のリーダー スレッドによって同時に保持される場合があります。書き込みロックは排他的です。

public void updateData() {
    lock.writeLock().lock();
    try {
        /* do stuff. */
    } finally {
       lock.writeLock().unlock();
    }
}


public List getData() {
    lock.readLock().lock();
    try {
       /* process/return data. */
    } finally {
       lock.readLock().unlock();
    }

}

于 2008-12-16T11:32:01.193 に答える
3

この記事をご覧ください: Java でのロックの読み取り/書き込み

この例で見られる唯一の欠点は、notifyAll() がすべての待機中のスレッドを起こしていることです。ただし、書き込みロック要求が優先されます。

于 2008-12-16T11:56:18.010 に答える
0

データへのアクセスを同期する必要があります。

public void updateData() {
    synchronized (updateLock) {
        /* do stuff. */
    }
}


public List getData() {
    List data;
    synchronized (updateLock) {
        data = getRealData();
    }
    /* process/return data. */
}
于 2008-12-16T11:01:28.323 に答える
0

CopyOnWriteArrayList または CopyOnWriteArraySet は一見の価値があります。更新が頻繁ではない状況で、私はそれらを大いに使用してきました。

于 2008-12-16T16:07:17.520 に答える