Threads korrekte Synchronisation bei Vector und ArrayList

redbomber

Bekanntes Mitglied
Hi zusammen, ich habe folgende Frage:
Die folgende Klasse wird in einem Thread bearbeitet, dabei wird doCriticalCode() aufgerufen.
Ein anderer Thread greift am Ende von aussen auf eine Liste dieser Klasse zu.
Jetzt möchte ich wissen wie ich das ganze korrekt synchronisiere.

1. bei einem Vector (der ja schon von sich auch synchonisiert ist:

Java:
public class NewClass {
   Vector<Integer> vector;

   public NewClass() {
      vector = new Vector<Integer>();
   }

   public Vector<Integer> getVector() {
      return vector;
   }

   private void doCriticalCode() {
      for (int i = 0; i < 100; i++) {
         vector.add(i);
      }
   }
   
   public void clearVector(){
      vector.clear();
   }
}

oder bei einer ArrayList:
Java:
public class NewClass {
   ArrayList<Integer> list;

   public NewClass() {
      list = new ArrayList<Integer>();
   }

   public ArrayList<Integer> getVector() {
      return list;
   }

   private void doCriticalCode() {
      for (int i = 0; i < 100; i++) {
         list.add(i);
      }
   }

   public void clearList() {
      list.clear();
   }
}

in beiden Fällen gilt:
wenn von außen auf die Liste/Vector zugegriffen wird, wird nur davon gelesen.

Wie muss ich hier jetzt also korrekt synchronisieren?
 

xehpuk

Top Contributor
Wie muss ich hier jetzt also korrekt synchronisieren?
Bei Vector überhaupt nicht (es sei denn, du willst über ihn iterieren, während er bearbeitet werden könnte), bei ArrayList kommts drauf an. Du schreibst:
Ein anderer Thread greift am Ende von aussen auf eine Liste dieser Klasse zu.
Er greift also erst drauf zu, wenn der andere Thread fertig ist? Dann musst du nichts synchronisieren, musst aber sicherstellen, dass die Änderungen an der ArrayList für jeden Thread sichtbar werden. Ich denke, dass dann folgende Änderungen ausreichend sind:
Java:
public class NewClass {
   volatile ArrayList<Integer> list;
 
   // ...
 
   private void doCriticalCode() {
      for (int i = 0; i < 100; i++) {
         list.add(i);
      }
      flush();
   }
 
   private void flush() {
      list = list; // Der Arbeiterthread veröffentlicht damit all seine lokalen Änderungen.
   }
 
   public void clearList() {
      list.clear();
      flush();
   }
}
 

FArt

Top Contributor
Sagen ja schon der Methodenname und der Kommentar.

Habe das von hier: AngelikaLanger.com - Details zu volatile-Variablen - Angelika Langer Training/Consulting (Abschnitt "volatile-Referenzvariablen")

In dieser Form meckert der Eclipse-Compiler nicht. Entfernt man das
Code:
volatile
, erscheint eine Warnung ("Assignment has no effect.").


Ich kenne das so (und Angelika Langer macht das auch so), dass man ein temporäres Objekt erstellt, die Objekte dort einträgt und danach die Referenz schreibt, die dann den Flush im Speicher auslöst. Das ist m.E. lesbar und eingängig.

Ich könnte mir vorstellen (müsste man mal in der Spec bzw. der JSR nachsehen), dass list=list eine NOOP ist und vom Compiler wegoptimiert wird. Eclipse behauptet zumindest es wäre nicht so. Vermtulich zieht die Optimierung nur bei nicht-volatile Feldern.

Das ganze Beispiel ist aber dröge. Die Liste ist nicht private. Hinz und Kunz kann darauf zugreifen und das ganze inkonsistent werden lassen.

Eine Lösung mit volatile würde ich hier bei der Liste nur wählen, wenn ein erheblicher Performanceunterschied zu normaler Synchronisation bestehen würde. Das explizite Aufrufen von flush() nach schreibenden Operationen ist m.E. ein Codesmell, genau so wie die Zuweisung von list auf list. Guter Code sieht anders aus.
 

xehpuk

Top Contributor
Ich wollte auch nur darauf hinaus, dass man nicht zwingend synchronisieren muss, wenn ein Protokoll eingehalten wird.
Am einfachsten macht man hier die Synchronisation wohl über eine [JAPI]CopyOnWriteArrayList[/JAPI].

Ich könnte mir vorstellen (müsste man mal in der Spec bzw. der JSR nachsehen), dass list=list eine NOOP ist und vom Compiler wegoptimiert wird.
Also javac optimiert da nichts, weder mit noch ohne volatile. Eventuell die JVM? Bin auf dem Gebiet Laie.

Das explizite Aufrufen von flush() nach schreibenden Operationen ist m.E. ein Codesmell
Ist doch im Prinzip wie der Aufruf von
Code:
repaint()
in Swing-Anwendungen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
R Datentypen Korrekte integer in Hex ASCII Konvertierung und serialisierung Allgemeine Java-Themen 1
S Korrekte Pfadangaben damit eine .jar Datei unter Windwos läuft. Allgemeine Java-Themen 24
T Synchronisation einer Textdatei im Groupshare Allgemeine Java-Themen 1
G Synchronisation nicht statischer Methoden Allgemeine Java-Themen 4
K Threads - Swing - Synchronisation nötig? Allgemeine Java-Themen 8
K Thread Synchronisation Allgemeine Java-Themen 8
T Synchronisation von Listen bei Zugriffen durch mehrere Prozesse Allgemeine Java-Themen 15
F Bluetooth / Synchronisation : Problem mit einer Bluetoothanwendung Allgemeine Java-Themen 3
T Project Synchronisation Allgemeine Java-Themen 4
B Ausgabe auf der Konsole bei Nebenläufigkeit, Threads und Synchronisation Allgemeine Java-Themen 8
B Nebenläufigkeit, Threads und Synchronisation Allgemeine Java-Themen 10
R Konzept eines Software-Rollout/Synchronisation via WebService Allgemeine Java-Themen 5
H Thread Synchronisation. mutex.lock(); und mutex.unlock(); Allgemeine Java-Themen 4
S Synchronisation von Threads Allgemeine Java-Themen 7
T problem mit synchronisation Allgemeine Java-Themen 4
G Links zum Thema Synchronisation Allgemeine Java-Themen 7
H LRUMap und Synchronisation Allgemeine Java-Themen 5
F Synchronisation + Vector/ArrayList/LinkedList Allgemeine Java-Themen 7
S synchronisation einer Methode abhängig vom Parameter Allgemeine Java-Themen 10
S Threads und Synchronisation Allgemeine Java-Themen 3
A Synchronisation Datenquelle und Anwendung (Multi-User) Allgemeine Java-Themen 7
A Daten-Synchronisation Client <-> Datenquelle (DB) ? Allgemeine Java-Themen 6
C Synchronisation aber trotzdem parallel lesen Allgemeine Java-Themen 2
A Vector Strings in Array splitten Allgemeine Java-Themen 6
G Fehler mit Vector Allgemeine Java-Themen 3
M String Array Vector komprimieren und verschicken Allgemeine Java-Themen 3
P Vectorelemente in einen anderen Vector kopieren Allgemeine Java-Themen 12
U Vector aus Oberklasse spezialisieren Allgemeine Java-Themen 2
R Vector in JList Allgemeine Java-Themen 11
M Cast double[]-->Object[] oder Vector<double[]> Allgemeine Java-Themen 3
H Index Out of Bounds bei Vector Allgemeine Java-Themen 4
H Java Vector Frage Allgemeine Java-Themen 9
E NetBeans Vector durch ArrayList ersetzen Allgemeine Java-Themen 4
C Vector/Point-Problem Allgemeine Java-Themen 3
M Buffer-Vector einzeln und zusammen synchronisieren Allgemeine Java-Themen 4
B Suchalgorithmus der Klasse Vector Allgemeine Java-Themen 5
X Vector Allgemeine Java-Themen 3
S 2D Vector speziell ausgeben. Allgemeine Java-Themen 2
S Vector in Vector gespeichert, wie greift man darauf zu? Allgemeine Java-Themen 3
C Swing JTable Vector aus DB adden Allgemeine Java-Themen 3
R Vector.clear() oder neu initialisieren Allgemeine Java-Themen 3
S vector & strings Allgemeine Java-Themen 26
X Vector in Intervall-Menge umwandeln Allgemeine Java-Themen 4
D Array oder Vector in Enum Deklarieren Allgemeine Java-Themen 3
J Erweiterte For-Schleife mit Vector Allgemeine Java-Themen 5
G JComponent in Vector - wie klonen? Allgemeine Java-Themen 7
V Performancefrage int-Vector/Stack Allgemeine Java-Themen 10
N HashMap<String,Vector<String>> a = new HashMap<String,Vector<String>>(); Allgemeine Java-Themen 4
H GUI: RectangleDrawer - zu viele Elemente im Vector für die paint-Methode Allgemeine Java-Themen 6
S JList in Vector Allgemeine Java-Themen 3
I Vector mit Objekten sortieren,Videos mit JMF wiedergeben Allgemeine Java-Themen 6
MQue Vector<..> nicht verwenden Allgemeine Java-Themen 4
H Vector<Character> zu char[] castern Allgemeine Java-Themen 2
T Element aus Vector entfernen Allgemeine Java-Themen 4
Spot84 Vector nach Ressourcetyp sortieren Allgemeine Java-Themen 4
M get Funktion von Vector Allgemeine Java-Themen 4
N wie greife ich auf hashmap in vector zu Allgemeine Java-Themen 9
V NullPointerException bei Vector Allgemeine Java-Themen 2
E einfache Frage zu Vector Allgemeine Java-Themen 8
K Serialisierung von Hashmap in Vector Allgemeine Java-Themen 3
G Vector beim Initialisieren befüllen Allgemeine Java-Themen 4
G Vector addAll Allgemeine Java-Themen 5
B sorteiren von Datein nach Zeitstempel in einem Vector Allgemeine Java-Themen 5
W [solved] Vector sortieren (Collection / Comparable?) Allgemeine Java-Themen 7
MQue Vector Allgemeine Java-Themen 7
F Vector in eine Datenbank speichern? Allgemeine Java-Themen 3
P Vector auf JTree Allgemeine Java-Themen 6
P dynamisches Array / Vector Allgemeine Java-Themen 2
P JTable/Vector Allgemeine Java-Themen 5
T Vector und remove? Allgemeine Java-Themen 13
T Vector in JAVA ? Allgemeine Java-Themen 10
P Vector in vielen Klassen Allgemeine Java-Themen 21
MQue Vector implementieren Allgemeine Java-Themen 2
MQue Vector<State> Allgemeine Java-Themen 2
O hilfe bei Vector frage Allgemeine Java-Themen 6
Z Elemente in Vector nach Häufigkeit sortieren. Allgemeine Java-Themen 13
H java.util.Vector langsam ? Allgemeine Java-Themen 5
H Vector<T>[] vecs = new Vector<T>[10]; geht nicht Allgemeine Java-Themen 2
N Java API java.util.vector Allgemeine Java-Themen 3
G Vector erweitern Allgemeine Java-Themen 4
S Vector sortieren nach Objekt-Info? Allgemeine Java-Themen 9
A Probleme mit Vector Allgemeine Java-Themen 6
M Vergleich im geordeten Vector und Methodenaufruf Allgemeine Java-Themen 2
J Vector - Wert ersetzen Allgemeine Java-Themen 14
J Vector - Boolean Allgemeine Java-Themen 24
M Vector zu einem byte[] Allgemeine Java-Themen 5
J Vector<Shape> Speichern [gelöst] Allgemeine Java-Themen 11
Y Array mit ID in Vector Allgemeine Java-Themen 6
T Vector <-> double Allgemeine Java-Themen 4
T ArrayList bzw. Vector per set-Methode? Allgemeine Java-Themen 3
T ArrayList oder Vector als Parameter? Allgemeine Java-Themen 7
M Vector add() unchecked? Allgemeine Java-Themen 5
M Probleme und Zeitdruck: Kunden-DB (Vector) Allgemeine Java-Themen 13
T Vector Array Allgemeine Java-Themen 5
M Kunden-DB mit Vector Allgemeine Java-Themen 9
J Vector sortieren Allgemeine Java-Themen 3
M Vector - contain Allgemeine Java-Themen 13
C String und char[] / String[] und Vector Allgemeine Java-Themen 21
N Vector -> 2Diminsonaler Array Allgemeine Java-Themen 10
N Alledateien in einem Ordner in ein Vector speichern Allgemeine Java-Themen 19

Ähnliche Java Themen

Neue Themen


Oben