2012-02-08 109 views
1

我有一個對象,我想要鎖定。鎖定對象java

class TestObj { 
    Lock lock = new Lock(); 

    public void lockObj { 
     lock.lock(); 
    } 

    public void unlockObj { 
     lock.unlock(); 
    } 

    // other methods/attributes omitted 
} 

class Test { 
    public static void main(String[] args) { 
     TestObj testObj = new TestObj(); 
     testObj.lockObj(); 
    } 
} 
請問

該鎖的TestObj對象?所以其他對象/線程不能訪問這個特定的TestObj?

+2

你爲什麼要鎖定一個對象?一個對象和一個線程是兩個完全不同的東西。而且一旦對象A引用了另一個對象B,就無法阻止A使用B.請解釋你想要在更高層次上做什麼。 – 2012-02-08 15:27:39

回答

1
請問

該鎖的TestObj對象?所以其他對象/線程不能訪問這個特定的TestObj?

它會鎖定在這個意義上,任何其他線程將阻止對象(即,等待)如果試圖調用lockObj()

如果另一個線程簡單地跳入並開始訪問對象而不調用lockObj(),沒有什麼可以阻止它。

在這一點上,我鼓勵您閱讀​​關鍵字,這是在Java中進行鎖定的慣用方式。 Java併發教程has some material

1

這不是通常使用的模式,但它可以用來防止其他線程訪問該對象。同一線程中的其他對象仍然可以訪問它。

正如@rcook指出的那樣,這並不妨礙其他線程訪問該對象,除非他們也嘗試獲取該鎖。

如果您獲取鎖並將其釋放爲該類的每種方法的一部分,則可以確定沒有獲取鎖的情況下無法訪問該對象。 (這就是通常推薦的原因)

有什麼理由不在這裏使用標準成語Lock

http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/locks/Lock.html

+2

我想你應該提到,這沒有什麼阻止其他線程訪問對象 - 它做了什麼,它阻止了其他線程獲取鎖定對象。只有其他線程在訪問之前獲得鎖定,纔會阻止訪問。恐怕OP可能不知道鎖定機制需要合作。 – arcy 2012-02-08 15:29:46