
– Szia Amigo!
– Igen, itt vagyok, itt vagyok.
"Ma a szinkronizálás gyakorlati használatáról fogok beszélni ."
"Ha egy programnak sok objektuma és szála van, gyakran előfordul, hogy több szál dolgozik egyidejűleg ugyanazzal az objektummal. Ennek során a szálak zavarják egymást."
– Igen, ezt már tudom.
"Tehát, tegyük fel, hogy egy objektumhoz több szál is hozzáfér. Két dolgot tehet a problémák elkerülése érdekében."
"Az első az, hogy szinkronizált blokkokat használjon minden olyan hely becsomagolására, ahol az objektumhoz hozzáférnek. Ez a megközelítés azonban nem biztos, hogy működik, ha néhány programozó olyan kódot ír, amely közvetlenül, szinkronizált blokk nélkül éri el az objektumot."
"Ezért a legtöbbször egy második megközelítést alkalmaznak – az objektumot szálbiztonságossá teszik." "Más szóval, a szinkronizált mechanizmus magába az objektumba van beépítve: szinkronizáltnak deklarálja a metódusait és/vagy a metódusaiban lévő kódot szinkronizált blokkokba csomagolja."
"Szóval minden objektumot, amelyet több szálból használhatok, és ez szinte minden objektum a programban, szálbiztossá kell tennem?"
"Általában igen. A valóságban egy programban nem minden objektumot használnak különböző szálak, de általában nagyon sok van. Tehát amikor elkezd kódot írni egy szálhoz, és eléri a különböző objektumokat, akkor minden metódusnál meghív fel kell tenned magadnak a kérdést: "Biztonságos ez a hívás?"
"Biztonságos?"
"Szálbiztos, ami azt jelenti, hogy több szálból is biztonságosan hívható."
"Íme néhány példa. Tegyük fel, hogy van egy String objektuma, amelyhez különböző szálakról lehet hozzáférni. Ahogyan azt már emlékeznie kellett volna, a String változatlan – akárcsak az összes többi primitív típus. Ez azt jelenti, hogy az objektum nem változik a létrehozása után Ez azt jelenti, hogy lehetetlen egy ilyen objektumot «eltörni». Minden megváltoztathatatlan objektum szálbiztos."
– Nos, ez megkönnyíti a dolgokat.
– Tegyük fel, hogy szüksége van egy változtatható karakterláncra.
"Igen, emlékszem. Kétféle ilyen karakterlánc létezik: StringBuffer és StringBuilder. A StringBuffer olyan, mint a StringBuilder, de minden metódusa szinkronizált. Szálbiztos is?"
"Igen. Ha több szálból kell elérni egy StringBuilder objektumot, ki kell cserélni egy StringBufferrel. Ellenkező esetben előbb-utóbb a szálak egyszerre megváltoztatják és «megszakítják»."
"Mi van akkor, ha a különböző szálakból elért objektum a saját osztályom objektuma? Ebben az esetben is szinkronizáltat kell hozzáadnom a metódusaihoz?"
"Igen. A legjobb, ha követed ezt a szabályt: minden objektumnak, amelyhez különböző szálakból lesz hozzáférve, szálbiztosnak kell lennie."
– Értem. Nem gondoltam volna, hogy minden ilyen komoly. Köszönöm, Ellie.
"Szívesen. Remélem, ezek a tippek segíteni fognak neked, amikor Diego megad néhány egyszerű feladatot. ☺"
GO TO FULL VERSION