[Konkurens] wait notify

Menczer Andor menczer.andor at gmail.com
Sun Dec 5 15:57:20 CET 2021


Sziasztok,

Csináltam egy egyszerű wait notify feladatot. Még félév elején mutattam a
hallgatóimnak egy wc-s példát, itt egyedül a szálindítás és a synchronized
kellett. Röviden ennyi volt a kód: 2 ember (szál) egyszerre akarja ugyanazt
a wc-t használni. Szinkronizálás nélkül egymásra nyitják az ajtót, ez nem
jó. Szinkronizált Toilet.use() metódussal viszont már megvárják egymást.

Ezt most kiegészítettem annyival hogy kell wc papír is a wc használathoz,
viszont alapból az nincs a helyiségben és várni kell a karbantartóra aki
feltölti papírral a tartályt (nem a víztartályt ;) ). Félév eleji tudással
ez úgy működne, hogy mivel egyszerre 1 ember lehet csak a helyiségben,
ezért a Toilet.refill() is szinkronizált, ekkor viszont aki a Toilet.use()
alatt blokkolódik wc papír hiány miatt az sohasem tudná befejezni a
feladatát, mert magára zárta az ajtót és benn várja a csodát (pontosabban a
wc papírt).

Egyszerű de rossz megoldás (ToiletSolvedBad) ha a Toilet.use() nem
blokkolódik hanem wait-t hív ha nincs elég papír, a Toilet.refill() pedig
notify-t hív a végén. Ez rossz mert a wait miatt másik ember is bemehet,
nem csak a karbantartó, hiszen a wait kinyitja a wc ajtót. Ehelyett be kell
rakni egy új objektumot a wc-be, pl egy telefont amivel lehet a wc papír
problémákat külön kezelni az ajtózárástól. Ezt az új objektumot szerezze
meg a benn lévő, hívjon rá egy wait-t, csak ekkor (vagy ha épp senki nem
akarja használni a wc-t) mehessen be a karbantartó a wc papírral. Ő majd
erre az objektumra nyomja a notify-t, ezért pont az az ember aki a wait-t
hívta fog visszamenni és befejezni a feladatát (hiszen magát a wc kulcsot
soha nem kellett vissza adnia a wc papír mizéria során).

Ezzel megtanulják a hallgatók hogy nem meggondolatlanul kell nyomogatni a
wait-notify-t hanem megfelelő objektumra kell zárni és megfelelő objektumra
kell a wait-notify is hívni különben hibás program születhet. Magyarul
végig kell gondolni hogy ideiglenesen amíg várunk milyen kulcsot akarunk
visszaadni és mit szeretnénk továbbra is birtokolni (nem pedig braindead
módon egyik helyre wait, másik helyre notify aztán lesz ami lesz).

Feladat szöveget nem írtam, de az kb annyi hogy megkapják a Toilet.java-t
és az a feladat hogy javítsd ki a busy waitinget wait-notify-ra.

Üdv,
Andor
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://plc.inf.elte.hu/pipermail/konkurens/attachments/20211205/621f91e7/attachment.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ToiletSolved.java
Type: application/octet-stream
Size: 1579 bytes
Desc: not available
URL: <https://plc.inf.elte.hu/pipermail/konkurens/attachments/20211205/621f91e7/attachment.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: ToiletSolvedBad.java
Type: application/octet-stream
Size: 1382 bytes
Desc: not available
URL: <https://plc.inf.elte.hu/pipermail/konkurens/attachments/20211205/621f91e7/attachment-0001.obj>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Toilet.java
Type: application/octet-stream
Size: 1420 bytes
Desc: not available
URL: <https://plc.inf.elte.hu/pipermail/konkurens/attachments/20211205/621f91e7/attachment-0002.obj>


More information about the Konkurens mailing list