Atomic és nem atomi művelet (java) - verem túlcsordulás az orosz

Honnan tudod, hogy milyen műveletek atomi, és bármely nem atomi?

A művelet az osztott memóriában régió hívják atomi ha befejeződik egy lépésben képest más hullámok, amelyek a hozzáférést ehhez a memóriát. Végrehajtása során egy ilyen művelet egy változó, nem egy szál nem tudja betartani a változás a félig kész. Atomic betöltés biztosítja, hogy a változó lesz betöltve teljesen egyszerre. Nem atomi műveletek nem adnak ilyen garanciát.

Ie ha jól értem, az atomi műveleteket - elég kicsi ahhoz, hogy végezzen „az eggyel képest más patakok.” De mit jelent ez a „lépés”?

Egy lépés == egy gép működését? Vagy valami más? Hogyan állapítható meg, hogy pontosan milyen műveletek atomi, és amely a nem atomi?

Ui Találtam egy hasonló kérdést. de beszélünk C #.

Hogyan állapítható meg a atomicitás?

Atomic műveletek gyakran jelölik ki annak a jele, hogy oszthatatlan: a műtét sem alkalmazzák teljes mértékben vagy nem alkalmazható egyáltalán. Jó példa erre az a rekord értékeket a tömböt:

Amikor nonAtomic módszer fennáll annak a lehetősége, hogy néhány szál vonzó lesz array [0], amikor a tömb [0] nincs inicializálva, és kap egy váratlan érték. Ha probablyAtomic (azzal a megkötéssel, hogy a tömb első feltöltéskor, majd később rendelt - most nem tudom garantálni, hogy a java ez a helyzet, de elképzelhető, hogy ez a szabály vonatkozik a példában) ezt nem kell: array mindig tartalmaz vagy null, vagy inicializált tömb, de a array [0] nem tartalmazhatnak semmi más, mint 1. ez a művelet oszthatatlan, és nem alkalmazható a fele, mint ahogy az nonAtomic - csak vagy teljesen, vagy egyáltalán nem, és a többi a kód lehet számítani, hogy a tömb vagy null, vagy az értéke I, anélkül, hogy további ellenőrzéseket.

Ezenfelül a atomicitás műveletek gyakran járnak láthatóság az eredmények minden résztvevő a rendszer, amelyhez tartozik (ebben az esetben - folyik); Ez logikus, de véleményem szerint nem kötelező ismérve atomicitás.

Miért fontos ez?

Atomicity gyakran abból ered üzleti alkalmazás követelményeinek: banki tranzakciók teljes egészében alkalmazni kell, koncertjegyek rendelhető közvetlenül a mennyiségeket, amelyeket meghatározott, stb Ez ebben az összefüggésben, hogy megérti (többszálas java), a feladatok primitívebb, de erednek ugyanazok a követelmények: például, ha meg van írva webes alkalmazás, elemzés a HTTP-kérést, a szerver kell az összes beérkező lekérdezéseket atomi hozzátéve, különben fennáll a veszélye elvesztése a beérkező kéréseket, és így a bomlás a szolgáltatás minőségét. Atomic műveletek garanciákat (oszthatatlan), és meg kell igénybe, ha ezek a garanciák szükségesek.

Ezen túlmenően, az atomi műveleteket linearizability - durván szólva, a teljesítmény bontható lineáris történet, míg az egyszerű művelet, hogy a történelem grafikon, amely bizonyos esetekben elfogadhatatlan.

Miért primitív műveletek nem atomi magukat? Így könnyebb lenne mindenkinek.

Modern futásidejű nagyon bonyolult, és a fedélzeten savanyú halom optimalizálást lehet tenni a kódot, de a legtöbb esetben ezek optimalizálása sérti a garancia. Mivel a legtöbb kód e garanciák nem igazán szükség, hogy könnyebb volt azonosítani ügyletek sajátos garanciákat egy külön osztály, nem pedig fordítva. Leggyakrabban, a példa mutatja, a változás a kifejezések sorrendjében - CPU és JVM jogosult elvégezni a kifejezés nem abban a sorrendben, ahogy azokat a leírt kódot, amíg a programozó nem erőltetni egy adott sorrendben a végrehajtás segítségével műveletek bizonyos garanciákat. Azt is példát (nem biztos azonban, hogy a formálisan helyes) leolvasási értékek memória:

Ott nem használják az úgynevezett kézből igazság érdekében, hogy ellenőrizzék a X értékét, így ezek az anomáliák lehetséges. Amennyire én értem, írni és olvasni közvetlenül a memóriába (vagy a memória és a megosztott cache processzor) - ez csak valami, ami növeli az illékony módosítót (itt lehet, hogy tévedek).

Természetesen optimalizált kód gyorsabban fut, de a szükséges garanciákat nem szabad feláldozni a teljesítményét a kódot.

Ez csak azokra a tranzakciókra felszerelésével kapcsolatos változók és egyéb feldolgozó ipar?

Nem. Bármely művelet lehet atomi vagy nem atomi, például a klasszikus relációs adatbázisok biztosítják, hogy a tranzakció - amely állhat adatok változások megabájt - vagy alkalmazza teljesen, vagy nem kell alkalmazni. CPU utasításokat itt semmi köze; atomi művelet lehet, mindaddig, amíg ez az atomi maga vagy eredményt a formájában egy atomi művelet (például, az eredmény az adatbázis tranzakció látható írásban a fájlt).

Ezen kívül, mint amennyire én értem, jóváhagyása „utasítás nem volt ideje egy ciklusban - nem atomi művelet” is helytelen, mert vannak olyan különleges utasításokat. és senki sem zavar, hogy atomi telepíteni minden értéket a memóriában a bejáratnál a védett egység, és vigyük el a kijáratot.

Bármely művelet lehet atomi?

Nem. Nagyon nincs elég szakértelemmel, hogy korrigálja a megfogalmazás, de amennyire én értem, minden olyan művelet, amely magában foglalja a két vagy több külső hatások (mellékhatások), nem lehet atomi definíció szerint. By mellékhatása elsősorban magában interakció a külső rendszert (ez egy fájlrendszer vagy külső API), de még a két nyilatkozatoknak a belső változók a szinkronizált blokk nem tekinthető egy atomi művelet, míg egyikük lehet dobni egy kivételt - és ez figyelembe véve a OutOfMemoryError és más lehetséges kimenetelek, lehet, hogy lehetetlen.

Van egy művelet két vagy több mellékhatást. Továbbra is valami köze hozzá?

Igen, akkor létrehozhat egy olyan rendszer alkalmazásának biztosítására az összes művelet, de azzal a kikötéssel, hogy bármely mellékhatása korlátlan számú nevezhetjük. Tudod teremt egy naplózó rendszer, amely atomi írja a tervezett működés rendszeresen konzultál a magazin, és végrehajtja, amelyek még nem alkalmazták. Ez felírható a következőképpen:

Ez biztosítja a haladást az algoritmus, de úgy szerinti kötelezettségek az időkeret (ami technikailag, és anélkül, hogy nem minden rendben van). Ha idempotens művelet egy ilyen rendszer előbb-utóbb jön a kívánt állapot nélkül észrevehető különbség a várt (kivéve futási idő).

Hogyan határozzák meg atomicitás műveletek a java?

Honnan tudod, hogy milyen műveletek atomi, és bármely nem atomi?

A kockázat felmerülésének a díjak a szexizmus, nem visszatartani magam, és egy példát atomi művelet: terhességi - szigorúan atomi művelet, mindig van egy és csak egy apa (mindenféle trükköket gén kivesszük a zárójelben).

Ezzel szemben, egy példa nem atomi műveleteket: Gyermek - és sajnos nem atomi művelet a gyermek sajnos a téma számos más, nem szinkronizált műveleteket a törékeny lélek a gyermek: anya, apa, nagymama, nagypapa, zomboyaschik, óvoda, iskola, barátok, barátnők, stb a listán.

A választ a január 24-én 11:58

Vicces összehasonlítás)))) - Ksenia január 24 at 15:10

Akkor valószínűleg azt jelenti, megtermékenyítés. ahonnan a terhesség kezdődik. Nagyon hirtelen például igen. - D-oldali január 25 at 2:21

Általában, akkor igen, én szándékosan beszélt lehető legsemlegesebb :) - Barmaley január 25 at 05:58

Hadd magyarázzam meg. Lehet, hogy tévedek.

Vannak java, forráskód összeállítani bytecode. Bájtkódjának futásidőben alakítjuk gépi kód. Egy utasítás / parancs bytecode lehet alakítani több gépi kódot. Ez a probléma a atomicitás. A processzor nem tudja végrehajtani egy parancsot írt magas szintű nyelv egy időben. végrehajtja a gépi kódot tartalmazó parancsokat. Következésképpen, ha a különböző processzorok végre a manipuláció ugyanazokat az adatokat, a különböző processzorok alternatív utasításokat.

Van egy globális változót:

Növelésének a változó nem atomi művelet, ehhez ugyanis legalább a három nyilatkozatai:

  • adatok olvasását
  • növekmény
  • adatok írása

Ennek megfelelően a két áramlás kell végezni ezt a sorozatot, de a végrehajtás érdekében nem zárnak közre. Emiatt, és lehetnek olyan helyzetek, mint például a következők:

  1. Az első adatfolyam olvasni
  2. A második adatfolyam olvasni
  3. Az első folyam nőtt 1
  4. A második áramot nőtt 1
  5. A második folyam rögzített értékének
  6. Az első folyam rögzített értékének

Az eredmény az eredmény 1 és nem 2, mint várták.

Ennek elkerülése érdekében használja vagy szinkron vagy atomi egységek a csomag java.util.concurrent

@etki rendesen, a probléma az, hogy nem minden utasítások végrehajtásra egy ciklusban. És ha egy számítógép szükséges, hogy minden műveletet végzünk a nagy ciklusok száma, akkor megáll a közepén a operetsii és megy a másik. Például abban az esetben egy bizonyos érték van i változó, akkor az ütemező megy másik feladat, és azt írja a regiszter értékét keretében vezetője. Amikor visszatér a probléma, a nyilvántartás értékkel tér vissza a múlt, neavisimo, hogy mit i. - faoxis január 18 at 10:43

Kapcsolódó cikkek