Ner*_*ron 2 java caching locking oracle-coherence
我有一个关于coherence lock-unlock机制的测试样本,如下所示:
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"));
}
}
}
Run Code Online (Sandbox Code Playgroud)
结果是:
true
false
Run Code Online (Sandbox Code Playgroud)
我期待的结果是:
true
true
Run Code Online (Sandbox Code Playgroud)
但情况是,我只有一个项目'test',我都在使用它,它只有一个缓存实例.因此缓存的所有者就是缓存实例.
为什么它无法关闭它并false最终返回?
谢谢
阿里
iva*_*kic 11
来自Oracle Coherence Developer's Guide:
当锁定到位时,调用者(在同一个线程或同一个集群节点中,取决于租用粒度配置)负责释放锁定.
默认情况下,Coherence使用线程所有权粒度,因此这可能是锁定未被释放的原因.
线程的值意味着锁由获取它们的线程持有,并且只能由该线程释放.成员的值意味着锁由群集节点保持,并且在获得锁的群集节点上运行的任何线程都可以释放它.
请参阅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了解更多详情.