Multithreading


... [ Seminar WWW und JAVA] ... [ Thema Java Virtual Machine ] ... [ Garbage Collection ] ...

Übersicht: Multithreading


Methoden zur Synchronisation von Threads in Java

Threads werden durch die Klassen Thread und ThreadGroup in Java erzeugt und verwaltet.

Um einen neuen Thread zu erzeugen, muß ein Objekt Thread erzeugt werden.
Ein Thread wird aktiviert, indem man die start Methode des Threads aufruft.

Zur Synchronisation der Zugriffe auf Objekte, ist jedem Objekt ein Lock zugewiesen. So kann jeweils nur ein Thread auf ein Objekt zu Zeit zugreifen.

Auf der Java-Sprachebene stellt das Schlüsselwort synchronized ein High-level-Konstrukt zur Verfügung, der die notwendigen lock und unlock Operationen erzeugt.

Im Bytecode werden lock und unlock durch die beiden Instruktionen monitorenter und monitorexit implementiert.


Koordination des Zugriffs auf den Speicher

Der Zugriff auf den Speicher erfolgt intern durch folgende atomare Operationen:

LOCK und UNLOCK werden immer gemeinsam vom Thread und "main memory" ausgeführt.

Jede LOAD Aktion des Threads gehört zu eine READ Aktion des "main memory", so daß das LOAD immer direkt auf das READ folgt.

Jede STORE Aktion des Thread gehört immer zu einer WRITE Aktion des "main memory". Das STORE folgt immer direkt auf ein WRITE.

Beispiel

class SynchSample {
	int a = 1, b = 2;
	synchronized void to() {
		a = 3;
		b = 4;
	}
	synchronized void fro(){
		System.out.println("a= " + a + ", b=" + b );
	}
}

Die Pfeile im Diagramm beschreiben hierbei die Abfolgen der Operationen.


Wait, Notify, NotifyAll

Zur Synchronisation von Abläufen stehen auch

Jedem Objekt ist ein sog. "wait set" zugeordnet.

Wenn ein Thread ein Objekt gelockt hat, wird durch die wait Methode der Thread dem "wait set" für dieses Objekt zugefügt, der Lock gelöst und der Thread solange nicht weiter ausgeführt, bis

Der Thread wird vom "wait set" des Objekts entfernt, versucht wieder einen Lock auf das Objekt zu setzen und macht, nachdem dies gelungen ist, mit der nächsten Instruktion nach dem wait weiter.

Die notify Methode kann nur aufgerufen werden, wenn der aktuelle Thread auch das Objekt gelockt hat, sonst wird die Exception IllegalMonitorStateException ausgelöst.

Analog gilt dies für notifyAll.


... [ Seminar WWW und JAVA ] ... [ Thema Java Virtual Machine ] ... [ Multithreading ] ... [ Garbage Collection ] ...