[linux-l] Debian-Mirror der belug...

Steffen Dettmer steffen at dett.de
Mi Okt 22 12:54:51 CEST 2003


* Oliver Bandel wrote on Mon, Oct 20, 2003 at 20:31 +0200:
> Ist "synchronized" ein Java-Keyword, das das Locking
> ermöglicht?

Ja, es synchronisiert den Block für exklusiven Zugriff auf die
gelockte Resource, bei Methoden ist das AFAIK sowas wie 

synchronized(this) { 
    //...
}

> Ist es also quasi doch ein explizites Locking?!

Ja, natürlich! Die zu lockenden Blöcke muß man ja aus Problem und
Design ableiten - das wird schnell sehr kompliziert. Ich glaub,
in Java darf man aber sowas wie

a = b;
a = 0;
a = null;
a++;

auch nicht-synchronisiert schreiben, ohne die Gefahr von
Phantomreads zu haben. Bei letzerem bin ich mir nicht sicher. In
c++ mußte das selbst implementieren, also sowas wie

class Int {
  public:
    Int(int i)
      : i-(i) { }

    int 
    operator(void) const
    {
       Guard<Mutex> monitor(mutex_);
       return (i_);
    }

    Int&
    operator++(void)
    {
       Guard<Mutex> monitor(mutex_);
       i_++;
    }

    Int&
    operator=(const Int &i)
    {
       int temp = i;
       Guard<Mutex> monitor(mutex_);
       i_ = temp;
       return (*this);
    }

  private:
    int           i_;
    mutable Mutex mutex_;
};

usw. (Guard lock im Konstruktor und unlockt im Destructor, siehe
Webseiten des ACE Vaters, komme gerade nicht auf den Namen).

Umständlicher, aber supermächtig. Allerdings braucht man
expliziete Threadsafeness auf dieser Ebene eher selten.

Hier sieht man bei operator= schon ein Problem: kann passieren,
daß der Int einen Wert bekommt, den die rechte Seite zu dem
Zeitpunkt schon nicht mehr hat. Ist hier vermutlich sehr
sinnvoll, weil deadlocksicher, aber bestimmt gibt's einen Fall,
wo das nicht gut ist :-)

oki,

Steffen

-- 
Dieses Schreiben wurde maschinell erstellt,
es trägt daher weder Unterschrift noch Siegel.




Mehr Informationen über die Mailingliste linux-l