Java Frage zu synchronized / parallele Thread-Abarbeitung

iwantmore

Cadet 4th Year
Registriert
Juli 2012
Beiträge
67
Schönen Guten Abend,
ich befinde mich gerade in der Prüfungsvorbereitung und mir wird dieser Abschnitt einfach nicht klar. Ich hoffe der Thread verstößt damit nicht gegen die Bordregeln ("Lösung von Übungen"). Ich brauche hoffentlich nur ein paar Denkanstöße.

Ich habe versucht mich durch "Java ist auch eine Insel" in das Thema einzulesen, jedoch gestaltet sich das ganze als ziemlich komplex und verwirrend.

Ich würde einfach mal das Beispiel liefern und meine Gedanken dazu äußern :)
Code:
class MyCalculator { 
static MyCalculator m1 = new MyCalculator(); 
static MyCalculator m2 = new MyCalculator();
static String st = new String("statische Variable!"); 
String ob1 = new String("Objektvariable!"); 
String ob2 = new String("Objektvariable 2!");

MyCalculator(){ ob2 = st; }

synchronized void calc1() { /* lange Rechnung */ } 

void calc2() { 
   synchronized (this) { /* lange Rechnung */ } 
}
 
void calc3() { 
   synchronized (st) { /* lange Rechnung */ } 
} 

void calc4() { 
   synchronized (ob1) { /* lange Rechnung */ } 
}
 
void calc5() { 
   synchronized (ob2) { /* lange Rechnung */ } 
}
}

Erfolgt die Abarbeitung parallel oder nacheinander, wenn
  1. Thread-1 m1.calc1() und Thread-2 m2.calc1() ruft?
    Parallel,da unterschiedliche Objekte
  2. Thread-1 m1.calc2() und Thread-2 m2.calc2() ruft?
    Parallel,da unterschiedliche Objekte
  3. Thread-1 m1.calc3() und Thread-2 m2.calc3() ruft?
    Ich denke hier ist der Fall klar: Sobald eine static Variable im Spiel ist, kann die Bearbeitung nur nacheinander erfolgen.
  4. Thread-1 m1.calc4() und Thread-2 m2.calc4() ruft?
    Parallel, weil ...
  5. Thread-1 m1.calc5() und Thread-2 m2.calc5() ruft?
    Durch den Fallstrick im Konstruktor (obj2 = st) ist die Variable wieder stätig, also nacheinander
  6. Thread-1 m1.calc1() und Thread-2 m1.calc2() ruft?
    keine Ahnung, wirklich...
  7. Thread-1 m1.calc3() und Thread-2 m1.calc5() ruft?
    Nacheinander? calc3 ist static und obj2 wird durch Konstruktur zum st und static...?

Stimmt es soweit?
Ich bin mir sehr unsicher und nehme gerne jede Hilfe an. Erklärende Links natürlich auch gerne gesehen.
 
1.-4. korrekt. bei 4. weil auf objekt-lokale objekte synchronisiert wird.

5. in synchronisierten statements wird auf objekte synchronisiert, nicht auf variablen. damit wird in beiden faellen auf das objekt st synchronisiert, da das statisch ist auf dasselbe objekt, damit wie du sagst nacheinander.

6. bei synchronisierten methoden wird auf deren objekt synchronisiert, d.h.
Code:
synchronized void foo() { ... }
ist (fast) identisch zu
Code:
void foo() { synchronized(this) { ... } }
. in deinem szenario hier wird also auf dasselbe objekt (m1) synchronisiert, dementsprechend also nacheinander abgearbeitet.

7. selbe situation wie in 6.
 
Wunderbar, vielen vielen Dank für die Erklärungen, das macht die Sache für mich verständlicher!
 
Es ist eine kleine Gemeinheit eingebaut. Da m1 und m2 vor st initialisiert werden ist ob2 immer null. Der Aufruf von calc5() produziert also eine NPE.
 
Iiih, das ist ja ekelhaft. Aber stimmt natürlich. Immer diese fiesen Dozenten mit ihren Fallstricken!
 
Zurück
Oben