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

Tobias Schlottke toby at schlottke.net
Mo Okt 20 18:10:46 CEST 2003


On Mon, 20 Oct 2003, Jan-Benedict Glaw wrote:

...
> > Locking wird in Java auf Objektebene realisiert.
> > Leider führt (zumindest bei den letzten jre's die ich
> > mir angeguckt habe) das Holen und Loslassen eines Locks
> > zu einem prozess-weiten Betriebssystem-Lock. Das frißt
> > leider ziemlich Performance.
>
> D.h., daß Du keine einfache, globale Variable unter einem Lock anpacken
> kannst, sondern diese in eine Klasse gießen mußt?

Ja:

class Counter {
  int value = 0;
  synchronized inc() {
    value++;
  }
}

Beim Eintritt in die Method wird das Object gelockt,
beim Verlassen wieder losgelassen. Man kann auch
innerhalb von einer Methode einen sogenannten
synchronized Block einfügen (der auch auf ein anderes
Object verweisen kann):

class MyThread {
  Counter counter;
  run() {
    synchronized (counter) {
      counter.value++;
    }
  }
}

(Ist mit der obigen Couner Klasse natürlich Unsinn,
hier geht's nur ums Prinzip)



> Kann ein Objekt nicht auch von mehreren Threads gleichzeitig benutzt
> werden? Wie sieht das da aus?

Jedes Object kann genau einen Locker haben. Wenn ein
Thread in einen synchronized Block eintritt, guckt er
ob bereits ein anderer Thread das betreffende Objekt
gelockt hat. Wenn nicht schreibt er sich selber rein,
führt den synchronized Block aus und löscht sich aus
dem Lockerfeld wieder raus.
Wenn in dem Lockerfeld schon einer drin steht, wartet
der Thread darauf das der laufende den synchronized
Block wieder verläßt.

Ohne synchronized Block können beliebig viele Threads
gleichzeitig beliebig viel Unsinn in dem Object treiben
:-)

Toby




Mehr Informationen über die Mailingliste linux-l