A java streamek szinkronizálása
Ha egy programon belül két vagy több szálat indítunk el, akkor előfordulhat, hogy több szál megpróbál hozzáférni egy erőforráshoz, és végül egy versennyel kapcsolatos probléma miatt váratlanul eredményezhet. Ha például több szál próbál írni ugyanarra a fájlra, akkor adatvesztéshez vezethet, mert az egyik szál felülírhatja az adatokat, vagy ha egy szál egyszerre megnyitja ugyanazt a fájlt, egy másik szál lezárhatja az egyiket, ugyanazt a fájlt.
Ezért több szál működésének szinkronizálása szükséges, és győződjön meg róla, hogy csak egy szál érheti el az erőforrást egy adott időpontban. Ez megvalósítható a monitorok fogalmával. Minden Java objektum olyan monitorhoz társul, amelyet a szál lezárhat és feloldhat. Egyetlen szál egyszerre tarthatja a zárat a monitoron.
A Java programozási nyelv nagyon kényelmes módja a szálak létrehozásának és szinkronizálásának a feladata szinkronizált blokkok használatával. A megosztott erőforrások ebben a blokkban maradnak. A következő a szinkronizált utasítás általános alakja:
Itt az objektumazonosító egy objektumra mutató hivatkozás. amelynek zárja a monitorhoz kapcsolódik. amely szinkronizált kijelentést jelent. Most két példát fogunk látni, ahol a számlálót két különböző szál felhasználásával nyomtatjuk ki. Ha a szálak nincsenek szinkronban, akkor a számláló értékét nyomtatja ki, amely nem a sorrendben van, de amikor a számlálót a szinkronizált () blokkba helyezzük, akkor mindkét áramhoz tartozó sorrendben nagyon nagy számlálót nyomtatunk ki.
Multithreading példa szinkronizálás nélkül:
Itt van egy egyszerű példa, amely képes vagy nem tudja nyomtatni a számláló értékét egy sorozatban, és minden alkalommal, amikor futtatjuk, más eredményt hoz létre, attól függően, hogy a processzor jelen van-e a patakhoz.
Ez a program minden futtatásakor eltérő eredményt ad:
Multithreading példa szinkronizálással:
Itt van ugyanaz a példa, amely egy sorozatban nyomtatja ki a számláló értéket, és minden alkalommal, amikor futunk, ugyanazt eredményezi.
Ez ugyanazt az eredményt jeleníti meg a program futtatásakor: