0

次のように使用するように設計した分散ロック クラスを作成しました。

myLock.lock();
doSomething();
myLock.unlock();

私の現在の実装では、lock() はロックが取得されるまでブロックします。しかし、この実装でいくつかのデッドロックの問題が発生しています。だから私はそれを非同期に書き直したいのですが、Javaでそれを行う方法がわかりません。

このようなものがうまくいくと思います:

myLock.lock(myCallbackFunction);

private void myCallbackFunction(boolean result){
    if(result){
        doSomething();
        mylock.Unlock();
    }
}

Javaでこれを行う方法はありますか?

編集 (詳細): 同期実装がデッドロックしている理由は複雑であり、関係ありません。分散ロックは、複数のシステムを持つネットワーク全体でリソースの相互排除を取得しています。本当に私が探しているのは、コールバック関数を受け入れるメソッドを作成する方法だけです。

4

2 に答える 2

3

Java ではまだできません。あなたができるLockCallbackことは、インターフェースを定義することです:

interface LockCallback {
  void run(boolean result, MyLock lock);
}

パラメータとして aをMyLock#lock取りLockCallbackます。その後、呼び出し元は次のように呼び出すことができます

myLock.lock(new LockCallback {
  public void run(boolean result, MyLock lock) {
    // ... do whatever needs to be done ...
    lock.unlock();
  });

Java 8 のラムダ構文により、これが少し見苦しくなるはずです。

于 2013-03-04T03:54:05.963 に答える
0

自分で書いて、うまくいかなかったためにアイデアを放棄する代わりに、すでに存在し、正しく実装されているSemaphoreを使用してみませんか?

于 2013-03-04T03:05:17.783 に答える