2017-07-05 4 views
1

synchronisiert Ich möchte eigene einfache Semaphore schreiben und es geschieht wie folgt:java auf Objekt synchronisiert vs auf dieser

class Semaphore { 
    private boolean done; 
    private final Object lock = new Object(); 

    public Semaphore(boolean done){ this.done = done;} 

    public void acquire() throws InterruptedException { 
     synchronized (lock) { 
      while (!done) 
       lock.wait(); 

      done = false; 
     } 
    } 

    public void release() { 
     synchronized (lock) { 
      done = true; 
      lock.notify(); 
     } 
    } 
} 

es funktioniert gut. Aber wenn ich synchronisierte (lock) mit synchronize (this) ersetze, fängt es an, IllegalMonitorStateException zu werfen. Warum?

+0

lock.wait() sollte() auch auf this.wait geändert werden. Also lock.notify(). –

+0

@Alexei yep, aber meine Frage ist, "warum diese Ausnahme geworfen wird", nicht "wie es funktioniert" – borune

Antwort

2

Als @Alexei Kaigorodov in Kommentar erwähnt, wenn Sie synchronized (lock) durch synchronize (this) ersetzen. Dann müssen Sie auch lock zu this in Ihrem Code ersetzen.

Als this auf aktuelle Objekt angeben, die sich von lock Objekt unterscheidet.

Jetzt haben Sie synchronized (lock) durch synchronize (this) ersetzt, was bedeutet, dass Sie jetzt versuchen, die Sperre für das aktuelle Objekt zu aktivieren, aber Sie auf das Objekt der Objektklasse gewartet haben.

Das funktioniert absolut in Ordnung:

public void acquire() throws InterruptedException { 
    synchronized (this) { 
     while (!done) 
      this.wait(); 

     done = false; 
    } 
} 

public void release() { 
    synchronized (this) { 
     done = true; 
     this.notify(); 
    } 
} 
+0

u sagte: "Da dies auf das aktuelle Objekt, das als Schloss Objekt anders ist." Ja, aber 'this' Objekt enthält' lock' Objekt, also nehme ich an, dass die Synchronisierung auf 'this' Objekt alle Operationen auf allen Mitgliedern meiner Klasse blockieren sollte. Ist es nicht? – borune

+0

ich meine, dass auf 'this' synchronisiert sollte auf allen Mitgliedern der Klasse synchronisiert funktionieren, da 'this stellt das gesamte Objekt und enthält alle Mitglieder – borune

+0

Um Ihre erste Frage zu beantworten. Nein, sie sind nicht gleich. – Ravi

Verwandte Themen