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.
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
und
notifyAll
zur Verfügung.
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
notify
Methode für das Objekt aufruft und der Thread als derjenige ausgewählt wird, der wieder weiterlaufen kann.
notifyAll
Methode für das Objekt aufruft.
wait
Methode angegeben wurde abgelaufen ist.
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 ] ...