2016-05-28 16 views
0

Was ist wirklich Atomic? Da ich eine Sprache wählen muss, um meine Frage klarer zu gestalten, würde ich Java wählen. Ich weiß, dass atomare Mittel alles oder nur Rollback/nichts tun. so sagen, ich habe folgendeWas ist wirklich Atom?

public class Myclass { 

    private boolean progress; 

    public void setProgress(boolean progress) { 
     this.progress = progress; 
    } 

    public boolean getProgress() { 
     return progress; 
    } 

} 

Nun welche der folgenden sind thread-safe oder atomare oder beides? bitte jede neue Linie als separates Stück

Code behandeln
 ------------------- 
    getProgress(); // 
    ------------------ 

    ---------------------- 
    setProgress(true); // 
    ---------------------- 

    ------------------- 
    getProgress() 
    setProgress(); 
    ------------------- 

    -------------------- 
    setProgress(); 
    getProgress(); 
    -------------------- 

Welche dieser Fälle würde Sinn AtomicReference in Java machen zu benutzen?

+0

Da 'progress' nicht 'volatile' ist, ist die Klasse nicht Thread-sicher. Wenn dies erledigt ist, sollte die Klasse Thread-sicher sein. – Turing85

+0

Wie bei atomaren Operationen: Das [Oracle Tutorial über atomischen Zugriff] (https://docs.oracle.com/javase/tutorial/essential/concurrency/atomic.html) definiert genau zwei atomare Operationen: das Lesen und Schreiben von jedem Primitiv Feld und Referenzfeld, außer "long" und "double's", sowie die Lese- und Schreibzugriffe auf 'volatile' Felder. – Turing85

+0

@ Turing85, haben die 'AtomicXxxxxxx'-Klassen einige zusätzliche atomare Operationen, die über diese beiden hinausgehen. Zum Beispiel "atomic.compareAndSet (expected, new)", das testet, ob die Variable "expected" ist, und falls ja, setzt sie auf "new", alles in einem einzigen atomaren Schritt. –

Antwort

2

Daraus:

What operations in Java are considered atomic?

Ich würde sagen, keiner von ihnen atomar ist, da Anruffunktion nicht eine atomare Operation ist. Aber sobald Sie in einer Funktion sind, ist das Zuordnen eines booleschen Wertes atomar (genau diese Zeile), und es wird nicht zurückgegeben.

Für Thread-Sicherheit einen Blick auf diese:

Are java getters thread-safe?

Grundsätzlich ist der alte Wert von „Fortschritt“ vielleicht innerhalb cpu zwischengespeichert, so dass selbst wenn es ein neuer Wert war Atom Zuordnung (nur, dass Zeile = wieder) ohne eine synchrone Zuweisung (AtomicBoolean oder synchronisierter Getter/Setter) ist es Thread-sicher, jedoch kann es Speicherkonsistenzfehler geben, so dass Sie diese Variable flüchtig deklarieren möchten, damit andere Threads den aktuellsten Wert sehen können.

+0

Sie haben die Frage zur Fadensicherheit völlig vernachlässigt. – Turing85

+0

erweitert ein wenig. Fühlen Sie sich frei zu bearbeiten. – Reek