Problém spícího holiče: Porovnání verzí

Smazaný obsah Přidaný obsah
JackieBot (diskuse | příspěvky)
m typo
Řádek 66:
* ve třídě obsluhující „čekárnu“ synchronizované metody pro zjištění počtu obsazených židlí (budou provádět zákazníci i holič), výběr zákazníka (bude provádět holič) a obsazení židle (budou provádět zákazníci). Tyto metody nahradí funkci semaforu Customers z předchozího příkladu, takže ve třídě zákazníka už žádné synchronizované metody potřeba nejsou.
 
Ještě snažšímsnazším řešením je využití '''synchronizovaných front'''. Od verze 5 je součástí standardní instalace Javy také balíček java.util.concurrent, který obsahuje kromě jiného rozhraní (interface) BlockingQueue, jeho potomka BlockingDeque a několik jejich implementací. Fronta, jejíž kapacita je omezená, symbolizuje čekárnu. Pro programátora je nejjednodušší, aby vlákno holiče provádělo v nekonečné smyčce metodu ''take'' (výběr zákazníka z čekárny; je-li prázdná, vlákno holiče čeká) a vlákna zákazníků se zařazovaly do fronty metodou ''put'' (je-li čekárna plná, vlákno zákazníka čeká). V tomto případě ani není nutné zjišťovat obsazenost čekárny – fronta toto obstarává automaticky.
 
Jedna z implementací BlockingQueue, ArrayBlockingQueue, poskytuje volitelnou funkci „spravedlivosti“ (fairness policy). Při nastavení této volby na true se vlákna čekající na uvolnění kapacity ve froně řadí dle pořadí příchodu, čímž řeší výše zmíněný problém hladovění po zdrojích.