2

このようなコヒーレンスロック-ロック解除メカニズムに関するテストサンプルがあります。

public class Test {


    public static void main(String[] args) throws InterruptedException, IOException, IllegalArgumentException, IllegalAccessException {

        Trt test=new Trt();
        test.lock();
        Thread a=new Thread(test);
        a.start();
    }

    public static class Trt implements Runnable{

        NamedCache cache=null;

        @Override
        public void run() {

            System.out.println(cache.unlock("asd"));


        }

        public void lock(){
            cache= CacheFactory.getCache(Globals.REGISTRY_CACHE_NAME);

            System.out.println(cache.lock("asd"));

        }

    }
}

したがって、結果は次のようになります。

true
false

私が期待している結果は次のとおりです。

true
true

ただし、「テスト」という項目は1つしかなく、すべて使用していて、キャッシュインスタンスは1つしかありません。したがって、キャッシュの所有者はそのキャッシュインスタンスです。

なぜそれを閉じて最終的に戻ることができないfalseのですか?

ありがとう

アリ

4

1 に答える 1

11

Oracle Coherence開発者ガイドから:

ロックが設定されている場合、ロックを解放するのは呼び出し元の責任です (リースの粒度の構成に応じて、同じスレッドまたは同じクラスター ノード内のいずれか)。

デフォルトでは、Coherence はスレッド所有権の粒度を使用するため、ロックが解放されないのはおそらくそのためです。

threadの値は、ロックを取得したスレッドによってロックが保持され、そのスレッドによってのみ解放できることを意味します。memberの値は、クラスター ノードによってロックが保持され、ロックを取得したクラスター ノード上で実行されている任意のスレッドがそれを解放できることを意味します。

http://docs.oracle.com/cd/E24290_01/coh.371/e22837/api_transactionslocks.htm#BEIIEEBBおよびhttp://docs.oracle.com/cd/E24290_01/coh.371/e22837/appendix_operational.htmを参照してください。詳細については、 #BAGJBCEFをご覧ください。

于 2012-06-13T12:37:41.100 に答える