2014-06-23 42 views
0

我想檢查類的對象上的鎖。我爲此使用Thread.holdsLock(this)。這是正確的方法嗎?檢查java中對象的鎖定

我的問題是我如何檢查對象是否鎖定爲主要方法,並檢查靜態方法上的鎖定。

public class CheckLock { 
    public static void main(String[] args) throws InterruptedException { 
     objectLockClass olc= new objectLockClass(); 
     Thread t1=new Thread(olc); 
     t1.start(); 
    } 
} 

class objectLockClass implements Runnable { 

    @Override 
    public void run() { 
     boolean isLocked = true; 
     int counter=0;  
     synchronized (this) { 
      while (isLocked) { 
       try { 
        Thread.sleep(5000); 
       } catch (InterruptedException e) { 
        e.printStackTrace(); 
       } 
       System.out.println("lock object in run : " + Thread.holdsLock(this)); 
       if (counter==5) isLocked=false; 
        counter++; 
      } 
     } 

輸出是:

lock object in run : true 
lock object in run : true 
lock object in run : true 
lock object in run : true 
lock object in run : true 
lock object in run : true 
+0

對於正常的鎖,是的。我同意這樣做。 –

+0

@JosefE。我可以通過使用t1和olc實例來檢查main方法中對象的鎖定。 – vinaybhatoa

+0

我不明白你在問什麼。請澄清。 –

回答

0

的對象是如何,我可以檢查鎖定爲主要方法,也對靜態方法檢查鎖?

對於方法沒有鎖定對象。它只是鎖定。期。 Java的​​關鍵字的實用性是,任何兩個線程都不能同時在同一個對象上同步。


詢問其他某個線程是否鎖定了某個對象通常沒有任何意義。 Thread.holdsLock(foo)方法不會告訴你:它只會告訴調用線程是否被foo鎖定。假設有的方法,Thread.otherThreadHoldsLock(foo),並假設你稱它是這樣的:

Object foo = ...; 

if (Thread.otherThreadHasLocked(foo)) { 
    doSomething(); 
} else { 
    doSomethingElse(); 
} 

它不會給你任何有用的信息:該代碼可以調用DoSomething的()以foo鎖定,或者以foo不鎖定;它可以調用doFomethingElse()並鎖定foo,或者foo不鎖定。沒有保證,因爲另一個線程可以隨時獲得鎖或釋放鎖。