Szinkronizált használata - 1

– 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. ☺"