Welche Operationen in Java gelten als atomar?
Antworten:
und vielleicht noch etwas mehr. Schau dir die jls an .
Wie in den Kommentaren erwähnt, bedeutet Atomizität keine Sichtbarkeit. Während ein anderer Thread garantiert keinen teilweise geschriebenen Thread sieht int
, wird er möglicherweise nie den neuen Wert sehen.
Die Operationen auf Long und Double werden auch auf herkömmlichen 64-Bit-CPUs atomar ausgeführt , obwohl keine Garantie besteht. Siehe auch diese Funktionsanforderung .
64 bit jvm, long and double assignments are also atomic.
Bist du sicher? Ich würde sagen, sie sind für kompilierten Code, aber was ist mit interpretiertem Code? Wahrscheinlich hast du recht, aber gibt es eine Garantie?
In Java ist das Lesen und Schreiben von 32-Bit- oder kleineren Mengen garantiert atomar.
Mit atomar ist gemeint, dass jede Aktion in einem Schritt stattfindet und nicht unterbrochen werden kann. Wenn wir also Multithread-Anwendungen haben, sind die Lese- und Schreibvorgänge threadsicher und müssen nicht synchronisiert werden.
Der folgende Code ist beispielsweise threadsicher:
public class ThreadSafe
{
private int x;
public void setX(int x)
{
this.x = x;
}
}
Es scheint, dass Zuweisungen von Longs atomar sind, basierend auf dieser Methode in AtomicLong.java:
public final void set(long newValue) {
value = newValue;
}
Beachten Sie das Fehlen einer Synchronisation.
value
. Es ist volatile
.
value
heißt volatile
, die Zuordnung von value
Atomic wird nicht vorgenommen, sondern lediglich "Veröffentlichungsprobleme" vermieden.
volatile
Longs und Doubles sind garantiert atomar: java.sun.com/docs/books/jls/third_edition/html/memory.html#17.7