2013-11-26 66 views
2

閱讀甲骨文javadocs for Object.wait() method,我不太明白這句話java.lang.Object.wait() - 「任何和所有」同步聲明?

地方本身在此對象的等待集中,然後放棄任何和所有同步聲稱此對象。

線程對單個對象有多少個聲明?爲什麼他們使用「任何和所有」而不是「......放棄在這個對象上。」進一步向下javadoc狀態:

請注意,等待方法,因爲它將當前線程放入此對象的等待集中,僅解鎖此對象;線程等待時,當前線程可能同步的任何其他對象將保持鎖定狀態。

......所以就在我想我可以延伸「任何和所有」的意義時,我意識到我不能。任何人都可以請幫忙爲我解決這個問題嗎?

回答

3

您可以多次同步對象。

synchronized(lock) { 
    synchronized(lock) { 
     lock.synchronizedMethod(); 
    } 
} 

調用lock.wait()發佈所有這些。

Java Language Specification

單個線程可以獲取鎖一次以上。

1

允許單個線程多次鎖定相同的對象。對於每個對象,Java虛擬機都會保持對象被鎖定的次數。解鎖對象的計數爲零。當線程第一次獲得鎖定時,計數再次遞增爲1。每次線程獲得對同一對象的鎖定時,計數再次遞增。 (只有已經擁有一個對象鎖的線程被允許再次鎖定它,如前所述,除非擁有線程釋放鎖,否則其他線程無法鎖定該對象。)每次線程釋放鎖時,計數都會遞減。當計數達到零時,鎖被釋放並可供其他線程使用。

synchronized(myLockObjA){ 
    synchronized(myLockObjB){ 
     synchronized(myLockObjA){ 
      //Do something. 
      // lock count for myLockObjA = 2 and for myLockObjB = 1 
      while(!someCondition) 
       myLockObjA.wait(); //lock count for myLockObjA = 0 and for myLockObjB = 1 
      //Now the thread will have to acquire lock on myLockObjA again after getting a wake up call by notify/notifyAll method. 
     } 
    } 
} 

的更多信息,可以發現here