2012-06-13 73 views
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

感謝

阿里

+0

它打印真實但不打印錯誤?並且在打印false之前退出程序? – alexey28

+0

我認爲這應該是真的。或者我錯誤地認爲:) – Neron

回答

10

從Oracle Coherence的開發者指南:

當鎖到位,這是調用者的責任(無論是在同一個線程在同一集羣節點,取決於租賃粒度配置)釋放鎖。

默認情況下,Coherence使用線程所有權粒度,所以這可能是鎖定未被釋放的原因。

螺紋的值表示鎖是由它們獲得的,並且只能由該線程釋放線程保持。 成員的值表示鎖由羣集節點保存,並且在獲取該鎖的羣集節點上運行的任何線程都可以釋放它。

有關更多詳細信息,請參閱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

+0

感謝隊友。真正有價值的信息 – Neron