Holtpont (holtpont) Java és módszerek foglalkozik vele

Kidolgozása során a többszálas alkalmazások gyakran dilemma: mi a fontosabb, mint a megbízhatóság és teljesítmény alkalmazásokhoz. Például használjuk szinkronizálás a termelés biztonságát (menet biztonság), míg az esetben helytelen sorrendben szinkronban, akkor hívja a biztosítóberendezés. Ugyanígy használjuk menet medencék és a szemafor, hogy korlátozza az erőforrások, és a hiba ebben a tervezés vezethet holtpont miatt az erőforrások hiánya. Ebben a cikkben fogunk beszélni, hogyan lehet elkerülni a holtpont, valamint egyéb problémák az alkalmazás teljesítményét. Azt is, hogy hogyan kérelmet lehet írni úgy, hogy képes lesz visszaállítani esetén a holtpont.
Holtpont - olyan helyzet, amelyben két vagy több folyamat vesz bizonyos forrásokat, megpróbál más források által tartott más folyamatok, és nem folyamat nem tud a szükséges forrásokat, és ennek megfelelően hagyják. Ez a meghatározás túl általános, ezért nehéz megérteni, hogy a legjobb a megértés, nézzük a fajta holtpontok a példákban.

Egymáshoz szinkronizálás érdekében


Tekintsük a következő problémát: a szükségességét, hogy írjon egy módszert műveleteket hajtsanak végre átvinni egy bizonyos mennyiségű pénzt egy másik számlára. A megoldás a következő lehet:


Első pillantásra ez a kód szinkronizált teljesen normális, van atomi művelet ellenőrzése és módosíthatja a számla a forrás szerinti állam és a változás a cél fiók. De amikor ez a szinkronizálás stratégia lehet egy patthelyzet. Nézzünk egy példát, hogy ez hogyan történik. két ügylet van szükség: honnan veszi az A fiók B x lefordítani a pénzt a számlára, és a számla B A - y. Gyakran előfordul, hogy ez a helyzet nem okoz a holtpont, de szerencsétlen körülmények, a tranzakció 1 veszi monitoron az ügylet monitor 2 veszi B. Eredmény - holtpont: 1 tranzakció várja az ügylet kiadás 2 számlák Monitor B, de ehhez a tranzakcióhoz 2 kell, hogy hozzáférjenek a monitor egy, elfoglalt tranzakciós 1.
Az egyik legnagyobb probléma a holtpont -, hogy nehéz megtalálni a tesztelés. Még a helyzet a példában ismertetett patakok nem lehet blokkolni, hogy van, lesz a helyzet folyamatosan játszik, ami nagyban megnehezíti a diagnózist. Általában le a problémát a határozatlanság egy tipikus multi-threading (bár nem a jobb is). Ezért minőségének javítása a többszálú alkalmazások, milyen fontos szerepet játszott kódáttekintés, mivel lehetővé teszi, hogy felismerjék a hibákat, ami problémás, hogy reprodukálja a tesztelésben. Ez persze nem jelenti azt, hogy a kérelem nem kell tesztelni csak a kód felülvizsgálata is, nem szabad elfelejteni.
Mit kell tennem, hogy ez a kód nem vezet zsákutcába? Ez az elzáródás okozta a tény, hogy a fiók szinkronizálási előfordulhatnak más sorrendben. Ennek megfelelően, ha kell vezetnünk néhány érdekében a számlák (ez egy olyan szabály, amely lehetővé teszi azt, hogy a számla kevesebb, mint A-tól B), akkor a probléma megoldódott. Hogyan kell csinálni? Először is, ha a számla valamilyen egyedi azonosító (pl számlaszám), numerikus, vonal, vagy más a természetes fogalma érdekében (vonalak lehet hasonlítani lexikografikusak érdekében. Feltételezhetjük, hogy szerencsések voltunk, és mindig először, hogy egy kisebb monitor a fiókot, majd több (vagy fordítva).

A második lehetőség, ha ez az azonosító nem, akkor azt, hogy dolgozzon ki magukat. Tudjuk, hogy első közelítésben összehasonlítani tárgyakat a hash kódot. A legvalószínűbb, hogy más lesz. De mi van, ha még mindig ugyanaz lesz? Akkor adjunk hozzá még egy objektumot a szinkronizáláshoz. Úgy tűnhet egy kicsit bonyolult, de mi a teendő. És különben is, a harmadik tárgy ritkán használják. Az eredmény a következőképpen fog kinézni:

Egymáshoz objektumok között


A leírt zár feltételek a legegyszerűbb esetben Detection retesz. Gyakran többszálas alkalmazások különböző tárgyakat próbál hozzáférni az azonos szinkronizált blokk. Ha ez a patthelyzet alakulhat ki. Tekintsük a következő példát: az alkalmazás számára a repülés diszpécser. Repülőgép jelentett a diszpécser, mikor megérkeztek rendeltetési helyükre, és engedélyt kér, hogy földet. A menedzser tárolja az összes információt a repülőgép, repülő az ő irányába, és lehet építeni a helyzetüket a térképen.

Értsd meg, hogy van egy hiba a kódban, ami oda vezethet, hogy holtpontra nehezebb, mint az előző. Első pillantásra nincs re-szinkronizálás, de nem az. Ön valószínűleg már észrevette, hogy a módszerek setLocation osztály Sík és GetMap a diszpécser osztály, szinkronizált, ami belül szinkronizált módszerek más osztályokba. Ez általában rossz gyakorlat. Arról, hogy hogyan lehet rögzíteni, lesz szó a következő részben. Ennek eredményeképpen, ha a repülőgép érkezik a helyszínre, ugyanabban az időben, mint valaki úgy dönt, hogy egy térkép holtpont előfordulhat. Azaz, a módszereket kell hivatkozni, és a GetMap setLocation, amely megteszi a monitorok és Dispatcher esetekben sík ill. Akkor GetMap módszer hatására plane.getLocation (különösen a Plane például, aki éppen foglalt), amelyet várja a kiadás a monitor egyes Plane példányban. Ugyanakkor, a módszer az úgynevezett setLocation dispatcher.requestLanding, míg a monitor fokon diszpécser foglalt rajz kártyát. Az eredmény - a holtpont.

nyílt felhívások


Annak érdekében, hogy elkerüljük azokat a helyzeteket, mint például, hogy azt az előző szakaszban, akkor ajánlott használni, a nyílt felhívás a módszerek más tárgyakat. Azaz, metódusokat a többi tárgyat kívül szinkronizált blokk. Ha kivesszük a elvének alkalmazása a nyílt pályázatok és átírni a módszerek setLocation GetMap lehetőségét patthelyzet. Úgy fog kinézni:

Erőforrás holtpont


Holtpontok is előfordulhat, valamint amikor megpróbál hozzáférni egyes források, hogy lehet használni, ugyanakkor csak egy szál. Ilyen lehet például egy tárolón keresztül. Ha néhány szál kell férnie egy időben a két vegyület, és kap ez a hozzáférés más sorrendben, ez vezethet a holtpont. Alapvetően ez a típusú zár nem lehet megkülönböztetni a zár szinkronizálási eljárás, kivéve, hogy nem merülnek fel, amikor megpróbál végrehajtani egy kódot, és amikor megpróbál hozzáférni források.

Hogyan kerüljük el a holtpont?


Természetesen, ha a kód van írva hibák nélkül (példák, amelyek láttuk az előző fejezetben), akkor a holtpontok, hogy nem lesz. De ki tudja garantálni, hogy a kód van írva hiba nélkül? Természetesen a teszt segít meghatározni a jelentős részét a hibák, de mint láttuk korábban, hibák többszálú kód nem könnyű diagnosztizálni, és még a vizsgálat után nem lehet biztos abban, hogy nincsenek helyzetek holtpont. Lehet valahogy biztonságban a zárat? A válasz - igen. Hasonló technikákat használnak az adatbázisban motorok, amelyek gyakran kell, hogy felépüljön a holtpont (társított adatbázis-tranzakció mechanizmus). Lock felület és annak végrehajtására rendelkezésre állnak a csomag lehetővé teszi java.util.concurrent.locks megpróbálják elvenni a monitor társított példányát az osztály által tryLock (true értékkel tér vissza, ha sikerült, hogy a monitor). Tegyük fel, hogy van egy pár tárgyat végrehajtása Lock felületet, és meg kell, hogy a monitorok, hogy elkerüljük a holtpont. Lehetőség van, hogy észre ezt:

Mint látható ebben a programban veszünk két monitor egyidejű, így nincs lehetősége a holtpont. Megjegyzés blokk try- végül miatt szükséges java.util.concurrent.locks csomag osztályok nem automatikusan mentesíti a monitor, és ha a teljesítése során a feladatokat volt némi kivételt, akkor a monitor lefagy egy lezárt állapotban van.

Hogyan diagnosztizálják a holtpont?


JVM lehetővé teszi diagnosztizálni holtpontok jelenítik meg guba patakok. Az ilyen lerakóhelyek információt tartalmaznak a feltétele a patak. Ha le van tiltva, a lerakó információkat tartalmaz a monitor, a kibocsátás, amely a menet vár. Mielőtt hozni egy szeméttelep JVM menet úgy néz ki a grafikon a várható (dolgozók) monitorok, és ha talál egy ciklust - hozzátéve információra holtpont, jelezve a résztvevő monitorok és patakok.
menet billenő biztosítóberendezés így néz ki:

A fenti lerakó világosan mutatja, hogy a két folyamat fut az adatbázis blokkolt egymást.
Annak érdekében, hogy diagnosztizálni holtpontok használja ezt a funkciót kell helyezni JVM hívások billenő művelet folyik különböző részein a program alkalmazásának vizsgálatára. Ezt követi, hogy elemezze a naplókat. Abban az esetben, ha azt jelzi, hogy volt egy holtpont, az információt a lerakó, hogy segítsen felismerni feltételeit annak előfordulása.

Általában akkor ne helyzetek például a holtpont. Ebben az esetben az alkalmazás valószínűleg sokkal stabilabb. De ne feledkezzünk meg tesztelés és felülvizsgálata kódot. Ez segít azonosítani a problémákat, ha ezek előfordulnak. Abban az esetben ön rendszer megtervezésénél, ami kritikus a helyreállítás terén holtpontok, akkor a módszer fejezetben leírt „Hogyan kerüljük el a holtpont?”. Ebben az esetben ez is hasznos lehet a módszer lockInterruptibly Lock interfész java.util.concurrent.locks csomagot. Ez lehetővé teszi, hogy a rajzon monitor aki ezt a módszert (és így felszabadítja a monitor).

Kapcsolódó cikkek