2013-11-26 35 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