2016-07-21 5 views
1

bei der Programmierung für ein Thread-sicheres Projekt, wie Sie bestimmen, welches Feld Thread sicher sein sollte. Zum Beispiel haben wir eine Klasse in einem Projekt namens TestThreadSafe in einem Multithread-Projekt.Thread Safe für Instanz Felder

public class TestThreadSafe { 
    public AtomicLong pCounter = new AtomicLong(); 
    public AtomicLong mCounter = new AtomicLong(); 
    protected final ConcurrentMap<K, V> Map = new ConcurrentHashMap<K, V>(); 
    private ScheduledExecutorService ses; 
    private String dir; 
} 

Hier, warum ses und dir nicht als endgültige oder volatile Felder definieren?

+0

Wir kennen die Verwendung dieser Felder nicht. Wenn sie nicht im Multithreading-Kontext verwendet werden, ist volatile nicht erforderlich. Wenn Sie die Referenz nicht ändern, ist final nicht erforderlich. –

+0

TestThreadSafe wird im Multi Threading-Kontext verwendet – lawrence

Antwort

0

Es ist immer gut, ein Feld als final zu markieren (Sie verlieren keine Leistung, aber gewinnen Kompilierzeit-Checks und Threading-bezogenen Bonus - Feld hat immer Wert gegeben, nicht der Standard).

Wie für volatile - es macht CPU-Optimierungen (Caches) gehen weg, so dass die Verwendung solcher Feld wird langsamer sein.

volatile sollte verwendet werden, wenn Sie den angegebenen Feldwert zwischen Threads teilen - wo ein Thread Daten schreibt und mehrere (> = 1) Threads daraus lesen.

+0

verwechselt mit Instanzfeldvariable Modifikator, welche Felder als final, volatile oder etwas anderes vor der Instanzfeldvariable deklariert werden sollen. Wie zu bestimmen und zu entscheiden, gibt es einen Standard, um das zu tun? – lawrence

+0

Es gibt keinen Standard, wenn es Java wäre, würde es für Sie tun. Sie müssen sich den Code ansehen und selbst entscheiden. Ich persönlich füge letzte Modifizierer überall hinzu und initialisiere Felder in Konstruktoren. –

0

Key note:

  1. Wenn Ihre Variablen nicht von mehreren Threads geändert, verwenden Sie nicht alles
  2. Wenn Ihre variable Referenz nach dem Anlegen nicht ändert, verwenden final
  3. Wenn Ihre Variable ist geändert durch einzelnen Thread und Zugriff durch andere Threads, verwenden Sie volatile
  4. Wenn Ihre Variablen geändert werden und auf mehrere Threads zugreifen: a. Verwenden Sie AtomicXXX, wenn Ihre Operationen Atomic sind - Einzelschritttransaktion b. Verwenden Sie synchronized oder Lock API, wenn Sie ein Codeblock müssen
  5. bewacht werden

Sie können mehr Details über hohe Parallelität finden Konstrukte here

Verwandte SE Fragen:

What is the difference between atomic/volatile/synchronized?

What is meant by "thread-safe" code?