Co je Concurrency v Javě?
V dnešním světě se vše rychle vyvíjí. V každém a ve všem je vždy rozsah vylepšení. Stejně je tomu v případě našeho programovacího jazyka. Dnes s našimi moderními technologiemi očekáváme, že se věci budou dělat snadno a rychle. Pro souběh více věcí najednou nebo pro souběh několika věcí vznikl koncept souběžnosti. Co vlastně souběžnost je, jaké je její použití, proč je to skutečně potřeba a mnoho dalších. Pokusíme se takové otázky dotknout a odpovědět na ně v tomto článku jeden po druhém. Pojďme tedy naši diskusi k velmi základní společné části, která je definicí souběžnosti. V tomto tématu se budeme učit o Co je Concurrency v Javě.
Definice souběžnosti?
Co vlastně je souběžnost? No, abychom odpověděli, že si vezmeme společný scénář. Předpokládejme, že při čtení tohoto článku se snažíte dělat více věcí najednou, možná se také pokoušíte udělat poznámku, možná se jí snažíte porozumět nebo si na něco promyslet. Jednoduše řečeno, snažíte se dělat více věcí současně. To je to, co znamená souběžnost. Souběžnost jednoduše provádí několik úkolů současně. V tomto článku budeme hovořit o souběžnosti v rozsahu Java jako programovacího jazyka.
Ve skutečnosti v Javě nebo obecně v jakémkoli programovacím jazyce je to podproces, který je zodpovědný za přenášení souběžnosti. Základní úlohou těchto vláken je usnadnit paralelní provádění úkolů. Mezitím si dejte základní definici vlákna.
Co je vlákno?
Vlákno je lehký proces s vlastním zásobníkem hovorů. Vlákno však má oprávnění pro přístup ke sdíleným datům z jiných vláken prováděných stejným procesem. V rámci Java aplikace můžeme použít mnoho vláken k dosažení paralelního zpracování nebo souběžnosti.
Nyní přejdeme k dalšímu tématu, které je,
Souběžnost v definici jazyka Java?
Takže v Javě nebo v jakémkoli jiném programovacím jazyce, jako je C # atd., Má celý jazyk OOP pojetí závitování. V Javě máme různé procesy, které se spouští vytvářením různých vláken k dosažení souběžnosti
Takže po této jednoduché definici pojďme diskutovat o našem novém tématu, které je:
Co dělá Java aplikaci souběžnou?
První třída, kterou je třeba udělat souběžně s aplikací java, je java.lang.Thread class. java.lang.Thread class je zodpovědná za všechny koncepty souběžnosti v programovacím jazyce Java. Poté máme rozhraní java.lang.Runnable pro abstraktní chování podprocesu mimo třídu podprocesů.
Další třída, kterou budeme potřebovat k vytvoření pokročilé aplikace, bude použita z balíčku java.util.concurrent přidaného v jazyce Java 1.5.
Nyní jsme dosáhli nové otázky, která zní:
Je Java Concurrency opravdu tak jednoduchá?
Jak se zdá, implementace souběžnosti v Javě je poměrně jednoduchá. Ve skutečnosti tomu tak ale není. Podívejme se na to.
Naše výše uvedená diskuse obecně vyvolává dojem, že souběžnost je ve skutečnosti jednoduchá, dobrá koncepce a poměrně snadno implementovatelná. Pokud tedy budeme sledovat lépe a pokusíme se to pochopit, zjistíme, že to vyžaduje značné porozumění základním konceptům a důkladné pochopení toho, čeho je třeba dosáhnout.
Pokud porovnáme souběžné aplikace a jednovláknovou aplikaci, obvykle zjistíme, že souběžná aplikace je složitá, pokud jde o návrh a porozumění. Kód spuštěný několika vlákny vyžaduje zvláštní pozornost a prostředky pro přístup ke sdíleným datům. Chyby objevující se kvůli nesprávné synchronizaci podprocesů je obtížné ladit a opravit. Také ve většině scénářů tyto chyby nejsou identifikovány v počáteční fázi, ve skutečnosti je detekováno v prod režimu, který je ještě těžší reprodukovat.
Kromě chyb a běžných defektů vyžadují souběžné podprocesy více prostředků ke spuštění aplikace
Problémy a zlepšení souběžnosti - vysvětlení s příkladem
V zásadě tedy existují dva typy problémů, které způsobují souběžnost. Tyto problémy lze široce rozdělit do dvou kategorií
- Chyby rušení nití
- Chyby konzistence paměti
Rozumíme každému jeden po druhém
Chyby rušení nití - Vysvětleme vám jednoduchý příklad.
Předpokládejme, že máme funkci čítače, jehož základní úlohou je zvýšit počitadlo nebo počet čísel. Nyní předpokládejme, že máme dvě vlákna, vlákno A a vlákno B. Předpokládejme, že vlákno A čte počáteční hodnotu jako 0. Nyní následující kroky probíhají postupně.
- Vlákno A čte počáteční hodnotu jako 0
- Vlákno B čte počáteční hodnotu jako 0
- Vlákno Zvýšení hodnoty o 1. Nová hodnota je nyní 1
- Vlákno B také paralelně zvyšuje hodnotu na 1.
- Vlákno A zapíše aktualizovanou hodnotu, která je 1, do paměťové buňky
- Vlákno B také opakuje stejný krok, který je zapsán do aktualizované hodnoty 1 buňky paměti
Tady tedy vyvstává problém. Dva podprocesy A a B, spusťte kód dvakrát a očekávaná hodnota je 2, ale to, co se odráží, je 1. Toto je hlavní problém, který by více podprocesů mohlo způsobit
Jak se to dá vyřešit?
Chyby interference nití lze vyřešit synchronizací přístupu ke sdíleným proměnným. Potřebujeme udržovat synchronizaci aktualizovaných hodnot mezi sdílenými daty
Podívejme se tedy na druhý typ chyby
Chyby konzistence paměti
K chybám nekonzistence paměti obvykle dochází, když se různá vlákna pokusí číst nebo mají nekonzistentní pohledy na stejný kus dat. K tomu obvykle dochází, když první vlákno aktualizuje některá sdílená data a tato aktualizovaná hodnota se nešíří do druhého nebo jiného vlákna a čte stará data.
Uvidíme, proč se to stalo?
Mohlo by to mít mnoho příčin. Kompilátor obvykle obvykle provede několik optimalizací aplikace, aby se zlepšil výkon. Může také aktualizovat sekvence pokynů za účelem optimalizace výkonu. Dokonce i obecně se procesory také pokoušejí optimalizovat kódy, například CPU může načíst aktuální hodnotu proměnné z mezipaměti nebo dočasného registru namísto hlavní paměti
Závěr - Co je to souběh v Javě?
Souběžnost je velmi důležitým rysem jakéhokoli jazyka OOP. Threading nám dává možnost provádět více procesů paralelně k sobě. Pomáhá nám to rychleji provádět náš složitý úkol. Avšak u profesionálů má souběžnost také několik nevýhod. Použití podprocesů způsobuje těžké využití zdrojů
Doporučené články
Toto byl Průvodce tím, co je souběžnost v Javě. Zde jsme diskutovali příklady a zlepšení v souběhu s příkladem. Další informace naleznete také v dalších navrhovaných článcích -
- Co je multithreading v javě?
- Jak připojit databázi v Javě?
- Co je multithreading v javě?
- Co je J2EE?