Co oznacza "atomowy" w programowaniu?

W książce Effective Java pisze:

Specyfikacja języka gwarantuje, że czytanie lub pisanie zmienna jest atomowa, chyba że zmienna jest typu long LUB double [JLS, 17.4.7].

Co oznacza "atomic" w kontekście programowania w Javie, lub programowania w ogóle?

 202
Author: csano, 2013-02-24

6 answers

Oto przykład, ponieważ przykład jest często jaśniejszy niż długie Wyjaśnienie. Załóżmy, że foo jest zmienną typu long. Następująca operacja nie jest operacją atomową:

foo = 65465498L;

Rzeczywiście, zmienna jest zapisywana za pomocą dwóch oddzielnych operacji: jednej, która zapisuje pierwsze 32 bity i drugiej, która zapisuje ostatnie 32 bity. Oznacza to, że inny wątek może odczytać wartość foo i zobaczyć stan pośredni.

Wykonanie operacji atomic polega na wykorzystanie mechanizmów synchronizacji w celu upewnienia się, że operacja jest postrzegana, z dowolnego innego wątku, jako pojedyncza, atomowa (tzn. nie dzielona na części) operacja. Oznacza to, że każdy inny wątek, po wykonaniu operacji atomowej, albo zobaczy wartość foo przed przypisaniem, albo po przypisaniu. Ale nigdy wartość pośrednia.

Prostym sposobem na to jest uczynienie zmiennej zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną zmienną]}

private volatile long foo;

Lub synchronizować każdy dostęp do zmienna:

public synchronized void setFoo(long value) {
    this.foo = value;
}

public synchronized long getFoo() {
    return this.foo;
}
// no other use of foo outside of these two methods, unless also synchronized

Lub zastąpienie go AtomicLong:

private AtomicLong foo;

 300
Author: JB Nizet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-18 20:39:24

"operacja atomowa" oznacza operację, która wydaje się być natychmiastowa z perspektywy wszystkich innych wątków. Nie musisz się martwić o częściowo kompletną operację, gdy gwarancja ma zastosowanie.

 41
Author: H2ONaCl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 13:25:19

Jest to coś, co "wydaje się reszcie systemu występować natychmiastowo" i podlega kategoryzacji liniowości w procesach obliczeniowych. Cytując ten artykuł dalej:

Atomiczność jest gwarancją izolacji od procesów współbieżnych. Dodatkowo, operacje atomowe często mają sukces lub porażkę definicja - albo z powodzeniem zmieniają stan systemu, lub nie mają widocznego efektu.

Więc na przykład, w kontekście systemu bazodanowego, można mieć 'Atomic commits', co oznacza, że można wypchnąć zestaw zmian aktualizacji do relacyjnej bazy danych i te zmiany będą albo wszystkie zostaną przesłane, albo żadna z nich w ogóle w przypadku awarii, w ten sposób dane nie zostaną uszkodzone, a w wyniku blokady i / lub kolejek, następna operacja będzie inny zapis lub odczyt, ale tylko po fakt. W kontekście zmiennych i wątków jest to tak samo, stosowane do pamięć.

Twój cytat podkreśla, że ta potrzeba nie należy oczekiwać zachowania we wszystkich przypadkach.

 18
Author: Grant Thomas,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-24 17:12:14

W filozofii starożytnej atom był ostateczną jednostką materii, na której opierały się bardziej złożone poglądy na materialną rzeczywistość. W programowaniu komputerowym atomic opisuje unitarne działanie lub obiekt, który jest zasadniczo niepodzielny, niezmienny, całkowity i nieredukowalny. Oto kilka zastosowań:

1) w strukturalnym języku zapytań, funkcja atomowa to taka, która albo zakończy się, albo powróci do pierwotnego stanu, Jeśli wystąpi przerwa w zasilaniu lub nienormalny koniec.

2) w jakimś Uniksie - podstawowe systemy operacyjne, operacja atomowa to taka, w której nie może nastąpić żadna zmiana w czasie między ustawieniem maski a odebraniem sygnału do zmiany maski.

3) w niektórych językach programowania, w tym Lispie , atom jest podstawową jednostką kodu wykonywalnego lub danych.

Operacja, podczas której procesor może jednocześnie odczytać lokalizację i zapisać ją w tej samej operacji magistrali. Zapobiega to zapisywaniu lub odczytywaniu pamięci przez inny procesor lub urządzenie We/Wy dopóki operacja nie zostanie zakończona.

Atomic oznacza niepodzielność i nieredukowalność, więc operacja atomowa musi być wykonana w całości lub wcale.

 15
Author: Jacky,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-06-25 05:42:13

Właśnie znalazłem post Atomic vs. Non-Atomic Operations być bardzo pomocne dla mnie.

" operacja działająca na pamięci współdzielonej jest atomowa, jeśli zakończy się w jednym kroku względem innych wątków.

Gdy atomic store jest wykonywany na pamięci współdzielonej, żaden inny wątek nie może zaobserwować modyfikacji w połowie ukończonej.

Gdy obciążenie atomowe jest wykonywane na współdzielonej zmiennej, odczytuje ona całą wartość tak, jak pojawiła się w jednym momencie w czas."

 10
Author: Kurt Zhong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-09-30 08:03:38

Jeśli masz kilka wątków wykonujących metody m1 i m2 w kodzie poniżej:

class SomeClass {
    private int i = 0;

    public void m1() { i = 5; }
    public int m2() { return i; }
}

Masz gwarancję, że każdy wątek wywołujący m2 odczyta 0 lub 5.

Z drugiej strony, z tym kodem (gdzie i jest długi):

class SomeClass {
    private long i = 0;

    public void m1() { i = 1234567890L; }
    public long m2() { return i; }
}

Wątek wywołujący m2 może odczytać 0, 1234567890l, lub inną losową wartość, ponieważ instrukcja i = 1234567890L nie jest gwarantowana jako atomowa dla long (JVM może zapisać pierwsze 32 bity i ostatnie 32 bity w dwóch operacjach i wątek może obserwować i Pomiędzy).

 10
Author: assylias,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 18:36:45