Форум: "Потрепаться";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
ВнизОцените дизайн сайта, пожалуйста. Найти похожие ветки
← →
Gero © (2004-12-29 21:24) [40]
> iZEN © (29.12.04 20:48)
Not found.
← →
iZEN © (2004-12-29 22:17) [41]to Gero © (29.12.04 21:24) [40]
Это он [jigsaw.w3.org] так перегружен - сам на него с пятого раза запостил. (-;
to TUser © (29.12.04 14:27) [29]
Вот фрагмент кода:/**
* Увеличивает внутренний счетчик,
* возможно активирует нить.
*/
public synchronized void release() {
if (counter == 0) {
this.notify();
}
counter++;
}
/**
* Уменьшает счетчик или блокирует,
* если тот равен 0
* @throws InterruptedException передается из this.wait().
*/
public synchronized void acquire() throws InterruptedException {
while (counter == 0) {
this.wait();
}
counter--;
}
Ваши аргументы надуманны из-за непонимания семантики synchronized-методов в Java. У каждого объекта (и ещё у каждого класса, кстати) есть внутренний монитор, который связывается во время исполнения JVM с synchronized-методами: два и более потока (нити) не могут одновременно исполнять не то что единственный synchronized-метод но и любые два и более synchronized-метода объекта. Поэтому код release() с acquire() будет выполняться всегда последовательно - один за другим, вне зависимости от того, сколько потоков (нитей) работает с семафором.
Комментарии:
this.notify() освобождает внутренний монитор объекта для первого попавшегося ожидающего (блокированного на мониторе) потока (нити);
this.wait() - единовременная блокировка потока (нити) на мониторе объекта - монитор взводится для конкретного потока (нити);
цикл while (counter == 0) {...} - виток - нужен для блокировки всех потоков (нитей), если они обращаются к коду при counter == 0.
Страницы: 1 2 вся ветка
Форум: "Потрепаться";
Текущий архив: 2005.01.16;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.039 c