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

但情况是,我只有一项“测试”,我都在使用它,而且它只有一个缓存实例。所以缓存的所有者就是那个缓存实例。

为什么它无法关闭它并false最终返回?

谢谢

阿里

4

1 回答 1

11

来自 Oracle Coherence 开发人员指南:

当锁到位时,调用者(在同一线程或同一集群节点中,取决于租约粒度配置)负责释放锁。

默认情况下,Coherence 使用线程所有权粒度,因此这可能是未释放锁的原因。

thread的值意味着锁由获得它们的线程持有并且只能由该线程释放。member的值表示锁由集群节点持有,集群节点上运行的任何线程都可以释放锁。

请参阅http://docs.oracle.com/cd/E24290_01/coh.371/e22837/api_transactionslocks.htm#BEIIEEBBhttp://docs.oracle.com/cd/E24290_01/coh.371/e22837/appendix_operational.htm #BAGJBCEF了解更多详情。

于 2012-06-13T12:37:41.100 回答