2016-10-04 51 views
2

比方說,我有這個類:的Java獲得監測鎖

public class Status { 
    private int x; 

    // monitor lock? 
    public Object myLock = new Object(); 

    public Status(int x) { 
     this.x = x; 
    } 

    public int checkVar() { 
     return x; 
    } 

    public int incrementVar() { 
     ++x; 
    } 
} 

然後,我有一個線程類是這樣的:

public class MyThread implements Runnable { 

    public void run() { 
     // Is this how to acquire monitor lock of Status class? 
     synchronized (statusInstance.myLock) { 
      statusInstance.checkVar(); 
      statusInstance.incrementVar(); 
     } 
    }  
} 

這是你如何獲得他人的監視器鎖上課好嗎?

+1

你還可以使用synchronized(statusInstance) – ravthiru

回答

2

Java如果您有任何對象的引用,您可以使用它作爲mutex。但是你會鎖定對象而不是類。

問題是,任何人都可以改變該對象,因爲它是公開的,並獲得他們不應該獲取的鎖。

statusInstance.myLock = new Object(); 

使用公共可變對象作爲互斥對象被認爲是有害的。您可以在給定的有類鎖是唯一一個在ClassLoader

synchronized(Status.class){ 
    .. 
} 

類或讓你的鎖靜態最終

public static final Object MY_LOCK = new Object();  
2

正確的。您也可以通過使用對象本身作爲鎖:

public class MyThread implements Runnable { 

    public void run() { 
    // Is this how to acquire monitor lock of Status class? 
    synchronized (statusInstance) { 
     statusInstance.checkVar(); 
     statusInstance.incrementVar(); 
    } 
    }  
} 

因爲你並不需要聲明myLock不再是簡單的。