Was bringt das synchronized bei der Methode?

The_F4nat1c

Mitglied
Java:
public static synchronized final void restart()
    {
        System.out.println("Initializing restart!");
        disable();
        enable();
        System.out.println("Restart performed!");
    }
Was bring das synchronized?

Bedeutet das ,dass wenn ein Thread die restart Methode aufruft kein anderer thread die disable Methode aufrufen kann?
 
Zuletzt bearbeitet:
Also wenn ich das richtig verstanden habe:
Wenn 2 threads die restart Methode aufrufen wollen führt erst der eine die Methode aus und nachdem er die Methode beendet hat führt der zweite Thread die Methode aus.
 
Ja, auf dem gleichen Objekt (bei static -> Klasse), versteht sich. Aber: die Synchronisierung ist nicht auf die einzelne Methode bezogen, sondern gilt für alle synchronized-Methoden "gemeinsam".
 
Als praktisches Beispiel, warum das so ist, schau dir die ArrayList an.
Wenn du ein Objekt aus der Mitte rauslöschst, wird der hintere Teil des Arrays nach vorne verschoben. Während dieser Zeit wäre es gefährlich, auf einen Index weiter hinten zuzugreifen. Je nach Timing kriegst du dann den Wert vor oder nach dem Verschieben, selbst die Abfrage nach der Größe der Liste würde ein zufälliges Ergebnis liefern.
 
Also müsste ich z.b
Java:
public class a{
    ArrayList<String> list = new ArrayList<>();
   
   public void test1(){
      synchronized(list){
        //TODO irgendwas mit der liste
   }
   public void test2(){
      synchronized(list){
        //TODO irgendwas mit der liste
   }
}
benutzen für ne ArrayList.
 
Sorry, hab da was falsches gesagt, ArrayList ist eben NICHT synchronized. Irgnd eine List-Implementierung war's, ich hab aber vergessen welche.
Sofern es tatsächlich Zugriffe mehrerer Threads auf die selbe Liste gibt, dann müsste man eingreifen, ich würde allerdints test2 und test1 synchronisieren und nicht etwas innendrin.
Wenn du tatsächlich mal direken Zugriff von mehreren Threads aus auf die selbe Liste erlaubst, dann kannst du sie mit Collections.synchronizedList() schützen, das solltest du aber eh nie machen.
 

Zurück
Oben