2012-10-11 29 views
1

我有一個正常的java線程理論的問題。Java線程模型

線程A已經採取了一些鎖定對象上,讓說xObj。現在線程B如何知道線程A已經對對象xObj進行了鎖定。

如何這已經在Java中實現。

在此先感謝。

謝謝您的回答....在這裏我想明確的是......我沒有實現this.My關心的是如何Java已經實現that.How線程B將結識某人有已經對Object.May是Object類或其他類已經實現了這個鎖。

+0

通過'採取鎖'你的意思是'捕獲監測對象'?如果是的話,你的問題的答案可能只能在JVM的本地代碼中找到。 – CAMOBAP

+0

synchronized(xObj){-----------------------}線程A已經鎖定了xObj.If線程B出現了,它將如何知道線程A已經取得了鎖,線程B將等待線程A釋放xObj上的鎖。 – VJS

+0

下面有很好的答案,但請注意,這種信息永遠不可靠:其他線程可能已經釋放了監視器,而其他某個線程甚至可能已經重新捕獲了它,在獲得結果並將其用於任何事情之間。它可能在調試死鎖和類似的東西時很有用。 – hyde

回答

1

線程A鎖定了一些對象,比如說xObj。現在線程B如何知道線程A已經對對象xObj進行了鎖定。

這取決於那種你正在談論鎖。

  • 對於原始的互斥體,一個線程不能測試,如果另一個線程持有互斥體,更不用說找出它是哪個線程。 (它可以測試但是如果持有鎖...)

  • Lock接口同樣不支持此。

  • ReentrantLock確實提供發現這一點的方法:看ReentrantLock.getOwner()。但請注意,這是一種protected方法,因此如果您想使方法通常可用,則需要創建ReentrantLock的子類。


我也懷疑這種方法的價值。它只能告訴你哪個(如果有的話)線程在進行呼叫時擁有該鎖。過了一會兒,主人可能已經改變了。

通過對比,Thread.holdsLock()爲您提供可以信賴的信息......儘管它是在大多數情況下無用的信息。

0

哪個鎖你在說什麼?如果是實例ReentrantLock,你可以叫

lock.getOwner() 

編輯:

synchronized(xObj) { } 

是不是鎖定爲你暗示。它在概念上更接近於monitor lock。你只有有限的使用synchronized塊功能 ,這也正是爲什麼類,如ReentrantLock的exists.From的文檔

使用synchronized方法和語句訪問具有相同的基本行爲和語義的隱式監視器鎖可重入的互斥鎖,但具有擴展功能。

+0

synchronized(xObj) { ----------------------- \t \t \t }線程A鎖定了xObj.If線程B來了,它將如何知道線程A已經取得鎖定,線程B將等待線程A釋放xObj上的鎖定。 – VJS

0

-當一個線程獲取對象的lock,那麼所有的​​方法只能通過該線程並沒有訪問,直到它離開鎖。

-如果Thread A具有的對象的lockThread B試圖訪問同一對象上的鎖,它can't access它。由於鎖具有A,對於線程B不重要,該鎖定與誰在一起,但鎖定可用。如果不是線程B進入阻塞狀態,直到線程A釋放鎖定爲止。

+0

線程B如何知道某個人(你是對的,對B不重要,鎖與誰在一起)已經鎖定了。這是我的問題。 – VJS

+0

@VJS,很好,你正在使用ReentrantLock然後你可以嘗試這個ReentrantLock.getOwner()。 –