2010-03-29 17 views
19

Zastanawiam się, dlaczego wątki spontanicznie budzą się z wait() w java.
Czy to decyzja projektowa? Czy to kompromis?Dlaczego wątki spontanicznie budzą się z wait()?

EDIT: (. Z Java współbieżności w Praktyce, str 300)

wait nawet pozwolono powrócić "fałszywie" - nie w odpowiedzi na wątku wywołującego zawiadomić.

Dalsze stan autorzy:

to jest jak toster z luźnym połączenie sprawia, że ​​dzwon zgaśnie gdy tost jest gotowy, ale również czasami, gdy nie jest gotowy.

Dlatego zawsze trzeba kodować jak

synchronized(this){ 
    while(!condition) 
     wait(); 
    } 
} 

i nigdy

synchronized(this){ 
    if(!condition){ 
     wait(); 
    } 
} 

Nawet jeśli tylko stan przejścia od false do true.

+0

Nie, proszę odwołać się do mojej edycji .. –

+0

W porządku, usunąłem swój komentarz, ponieważ wygląda na to, że masz rację. –

Odpowiedz

24

Te spontaniczne przebudzenia są również nazywane "fałszywymi przebudzeniami". W specyfikacji Java fałszywe pobudzenia są dozwolone dozwolone (choć nie zalecane) dla implementacji jvm.

Powodem, dla którego są dozwolone, jest wiele implementacji opartych na pthreadach (wątkach POSIX), które mają to zachowanie. Czemu?

Wikipedia:

Według David R. Butenhof za Programowanie z wątków ISBN 0-201-63392-2: „Oznacza to, że gdy czekać na zmiennej warunku, oczekiwania może (od czasu do czasu), gdy zwrot nie wątek specjalnie nadawanie lub zasygnalizował tej zmiennej warunku. Niepożądane wybudzeń może brzmieć dziwnie, ale w niektórych systemach wieloprocesorowych, podejmowania warunek wakeup całkowicie przewidywalne może znacznie spowolnić wszystkie operacje zmiennych warunkowych. Warunki race, które wywołują fałszywe wybudzeń powinno być uznane za rzadkie.”

+0

Dzięki za tło na POSIX, bardzo pouczające! – Ricket

+0

To ma wiele sensu. Dziękuję Ci! –

+0

Myślę, że zamieściliśmy to około 60 sekund od siebie. –

10

Trudno odpowiedzieć na to definitywnie od języka Java Specification nie stwierdza dlaczego implementacja JVM może chcieć to zrobić (tylko to określa, że ​​może, in this section), ale znalazłem a pretty interesting history of spurious wake-ups on Wikipedia.

Rzeczywista artykuł o POSIX wątków, ale nie sądzę, że to zbyt daleko od odcinka przyjąć, że gwintowania w Javie był nieco pod wpływem zachowania POSIX wątków:

Niepożądane wybudzeń może brzmieć dziwnie , ale w niektórych systemach wieloprocesorowych, stworzenie warunku przebudzenia całkowicie przewidywalnego może znacznie spowolnić wszystkie operacje zmiennych warunkowych. Warunki wyścigu, które powodują fałszywe przebudzenie, należy uznać za rzadkie.

Ten cytat jest David R. Butenhof, który następnie przechodzi się do powiedzenia:

Choć nie były rzeczywiście niektórzy członkowie grupy roboczej, która twierdziła, że ​​teoretycznie można sobie wyobrazić, że może być taką realizacją, która tak naprawdę nie była powodem. (I nigdy nie byli w stanie tego udowodnić). Wątki POSIX były wynikiem wielu napięć pomiędzy pragmatycznymi programistami pracującymi w czasie rzeczywistym, a w dużej mierze naukowcami akademickimi. Nieprawidłowe wybudzenia to mechanizm akademickiej klastra informatyków, który zapewnia, że ​​każdy musi napisać czysty kod, który sprawdza i sprawdza predykaty!

„Ale (chyba) w dużej mierze fałszywy (lub przynajmniej arcanely filozoficzny)«sprawność»Argument podeszła lepiej z czasu rzeczywistego ludzi, a prawdziwym powodem był zwykle spadł na drugie miejsce w uzasadnieniu.

” Wiele razy myślałem o tym, w jaki sposób można skonstruować poprawną i praktyczną implementację, która naprawdę zawiera fałszywe pobudki. Nigdy nie udało mi się zbudować przykładu. Nie oznacza to jednak, że nie ma, i to dobra historia.

Powiązane problemy