Parameter in synchronized-Blöcken verstehen

Vokabulator

Mitglied
Hallo!

Verstehe ich richtig, dass ich bei synchronized-Blöcken für den Parameter folgende Optionen habe:

- this
- ein eigens erstelltes lock-Objekt als Feld der Klasse
- Klasse.class
- ein statisches lock-Objekt als Feld der Klasse

Ich verstehe nicht genau, was da abläuft: Der Parameter ist dasjenige Objekt oder diejenige Klasse, deren lock ich benutze. Ist das dann die Monitor-Klasse? Und gibt es auch Situationen, in denen man eine Instanz eines anderen Objektes übergibt? Oder eine andere Klasse?

Und warum erstellt man manchmal dieses spezielle lock-Objekt?
 
Vokabulator hat gesagt.:
Verstehe ich richtig, dass ich bei synchronized-Blöcken für den Parameter folgende Optionen habe:
- this
- ein eigens erstelltes lock-Objekt als Feld der Klasse
- Klasse.class
- ein statisches lock-Objekt als Feld der Klasse

Naja vom Prinzip eben jedes beliebige Objekt - am Ende geht es salopp gesagt nur darum, dass eben immer genau die Blöcke, die sich gegenseitig ausschliessen sollen, auch das SELBE Objekt nutzen.

Es ist aber auf jeden Fall praktikabel, ein PRIVATES Objekt zu nutzen.

Denn:

Java:
//Deine von dir geschriebene Klasse: 
//die checkst du ein, denn dein Kommolitone braucht sie und will Sie benutzen 
public class YourClass {
  private synchronized void youDoYourStuff() {
    ...
  }

  private void youDoLotsOfOtherStuff() {
    synchronized(this) {
      ...
    }
  }
}


//Da ihr gemeinsam an einem größeren Projekt arbeitet, das nebenläufig umgesetzt wird,
//nutzt dein Kommolitone nun dankbar deine Klasse:
public class YourFriendsClass {
  private final YourClass yourClass = new YourClass();

  //Dein Kommolitone muss auch synchronisieren, kennt aber nur die Fassade deiner Implementierung.
  //Er kommt er auf die folgende Idee
  private void heDoesStuffToo() {
    synchronized(yourClass) { //broken !
      ...
    }
  }
}

Siehst du was passiert ist, er macht deine Implementierung kaputt und seine wird für ihn möglicherweise ein mysteriöses Verhalten an den Tag legen.

Klar?
 

Zurück
Oben