Jsem zpět z dovolené, na které jsem si s chutí přečetl knížku Java
Concurrency in Practice od týmu autorů v čele s Brianem Goetzem. Je v ní mnoho zajímavých věcí, z nichž je většina nepokryta předchozí literaturou. Autoři se věnují úskalím, které klade programování pomocí více vláken.
Zaujal mě problém pořadí zamykání, který může nastat v případě, že vlákna (nebo i procesy) adaptují synchronizaci pomocí blokujícího zámku. Autor vše ilustruje na dobře zvoleném příkladě – máme dva bankovní účty A a B; každá transakce musí nejprve uzamčít zdrojový účet, poté cílový a konečně může dojít k transakci. Je daný model funkční za všech situací?
Není, může dojít k problému při pořadí zamykání. Dvě vlákna mohou zároveň převádět částku z účtu A na B a také z účtu B na A. V tuto chvíli může dojít k deadlocku, kdy jedno vlákno čeká na zámek pro B a druhé pro A. Řešení je ovšem elegantní – zajistit, aby vlákna požadovala zámky vždy ve stejném pořadí. Například můžeme dát přednost účtu s nižším číslem a k situaci nikdy nedojde.
Většina textu knihy představuje na příkladech řešení daných problémů pomocí knihovny java.util.concurrent, která je od verze Javy 6.0 součástí JRE. Tato knihovna nabízí veliké množství pomůcek, jako jsou například thread pooly, task a executor framework, explicitní zámky, atomické primitivní typy a velmi zajímavé prvky neblokující synchronizace. Autoři kromě daných řešení předkládají také výkonnostní testy a analýzy. Nutno uznat, že velmi fundovanou formou.
Škoda jen, že kniha není napsána formou kuchařky. Po přečtení má člověk plnou hlavu nových myšlenek a nápadů, jak zlepšit (nejen svůj) kód. Do knihy určitě několikrát nahlédnu a mohu ji všem zájemcům o problematiku vřele doporučit.
Diskuze