2013-11-26 5 views
2

Чтение Oracle javadocs for Object.wait() method, я не совсем понимаю этой фразыjava.lang.Object.wait() - Заявки на синхронизацию «все и все»?

самого места в наборе ожидания для этого объекта, а затем отказаться от любого и все синхронизации утверждают на этом объекте.

Сколько претензий может иметь нить на одном объекте? Почему они используют «все и все», а не просто «... отказаться от блокировки на этом объекте». Далее вниз состояние javadocs:

Обратите внимание, что метод wait, поскольку он помещает текущий поток в набор ожидания для этого объекта, разблокирует только этот объект; любые другие объекты, на которых текущий поток может быть синхронизирован, остаются заблокированными во время ожидания потока.

... так что, когда я думал, что могу растянуть смысл «всех и всех», я понял, что не мог. Может ли кто-нибудь помочь мне разобраться в этом?

ответ

3

Вы можете синхронизировать объект несколько раз.

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

Вызов lock.wait() выпускает все эти.

От Java Language Specification

Одна нить может приобрести замок несколько раз.

1

Один поток разрешен для блокировки одного и того же объекта несколько раз. Для каждого объекта виртуальная машина Java поддерживает подсчет количества раз, когда объект был заблокирован. У разблокированного объекта есть счет нуля. Когда поток получает блокировку в первый раз, счетчик снова увеличивается до единицы. Каждый раз, когда поток получает блокировку на одном и том же объекте, счетчик снова увеличивается. (Только потоку, которому уже принадлежит блокировка объекта, разрешено блокировать его снова. Как уже упоминалось ранее, ни один другой поток не может блокировать объект, пока личный поток не освободит блокировку.) Каждый раз, когда поток освобождает блокировку, счет уменьшается. Когда счетчик достигнет нуля, блокировка освобождается и становится доступной для других потоков.

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

 Смежные вопросы

  • Нет связанных вопросов^_^