3

私は自分のニーズに合わせてカスタマイズされたクラスでラップしている再入可能なロックを持っています。ただし、アプリケーションの性質上、再入可能ロックへのロックを保持しているスレッドがスタックし (外部障害)、再入可能ロックの解放に失敗します。

リエントラント ロックを明示的にロック解除する方法があるかどうか疑問に思っています。再入可能ロックの API にはそのようなメソッドがないことは知っていますが、一定時間後に再入可能ロックをロック解除するか、再入可能ロックを保持しているスレッドを強制終了するタイマー タスクを導入することを考えていました。

再入可能ロックを強制的にロック解除しようとする際に、他に何か提案はありますか? 私の解決策はかなりなので、私は尋ねます。

4

2 に答える 2

2

外部でロックを解除する代わりに、別のスレッドでブロッキングコードを実行し、タイムアウトさせます

このようなもの

Future<MyTask>future = taskExecutor.submit(myTask)
try {
    future.get(5,TimeUnit.Seconds);
    ...
    }
    catch (Exception e)
    {
        future.cancel(true); // attempt to interupt the thread
        throw new Exception();
    }
于 2012-10-09T01:58:05.597 に答える
1

私のコメントによると、try/finally何か問題が発生した場合にロックが確実に解放されるように、ロックをブロックにラップする必要があります

_lock.lock(); // will wait until this thread gets the lock
try
{
    // critical section
}
finally
{
    //releasing the lock so that other threads can get notifies
    _lock.unlock();
}       

これは、 Lock Objectsトレイルで実証されています。

于 2012-10-09T02:00:26.420 に答える