Ich fange an, Java zu lesen und bin im Multithreading-Thema. Außerdem bin ich ein C-Programmierer, daher habe ich Kenntnisse im Threading für C-Sprache.
Ich habe gesucht, wie Threads auf einem bestimmten Objekt miteinander kommunizieren.
Ich habe diese Frage gefunden Java: Wie können die Methoden wait () und notify () für Objekte aufgerufen werden, die keine Threads sind? aber ich habe widerspruch.
Was ich das weiß synchronized
Schlüsselwort wendet das Konzept des Verriegelungsmechanismus an. Also wenn ich von einem Objekt synchronisiert und dann angerufen habe wait
Bedeutet dies für dieses Objekt, dass die Sperre freigegeben wird, damit ein anderer Thread darauf zugreifen kann? Wie das Beispiel im vorherigen Link
Antworten:
3 für die Antwort № 1Sie sagen, Sie sind mit dem Threading in C vertraut.
Sie können das Verhalten von Java verstehen, indem Sie sich ein Implizit vorstellen p_thread_mutex_t
Variable und ein implizites pthread_cond_t
Variable, die jedem Java-Objekt zugeordnet ist.
Angenommen, wir haben ein Objekt, foo. Lass uns verwenden m (foo) um den imaginären Mutex zu bezeichnen, und lasst uns verwenden c (foo) die imaginäre Bedingungsvariable zu bezeichnen.
EIN synchronized(foo) { ... }
Blockschloss ist fast dasselbe wie das:
pthread_mutex_lock(m(foo));
...
pthread_mutex_unlock(m(foo));
Der einzige Unterschied ist, dass Java garantiert, dass es keine Möglichkeit gibt, den synchronisierten Block zu verlassen, ohne den Mutex zu entsperren. Auch wenn das ...
Löst eine Ausnahme aus, wird der Mutex dennoch freigeschaltet.
Also, die Antwort auf Ihre Frage:
Ein Anruf an foo.wait()
im Grunde übersetzt pthread_cond_wait(c(foo), m(foo));
2 für die Antwort № 2
Wenn wait () aufgerufen wird, wird die Sperre für das synchronisierte Objekt freigegeben. Siehe den folgenden Auszug aus der Oracle-Dokumentation. Das Wort "Monitor" bedeutet so viel wie "Sperre"
" öffentliches abschließendes ungültiges Warten () wirftInterruptedException Bewirkt, dass der aktuelle Thread wartet, bis ein anderer Thread die notify () -Methode oder die notifyAll () -Methode für dieses Objekt aufruft. Mit anderen Worten, diese Methode verhält sich genau so, als würde sie einfach die Anklopffunktion (0) ausführen. Der aktuelle Thread muss den Monitor dieses Objekts besitzen Thread gibt das Eigentum an diesem Monitor frei und wartet, bis ein anderer Thread Threads benachrichtigtWarten auf den Monitor dieses Objekts, um entweder durch einen Aufruf der notify-Methode oder der notifyAll-Methode aufgeweckt zu werden. Der Thread wartet dann, bis er den Besitz des Monitors wiedererlangen und die Ausführung fortsetzen kann.
Wie in der Ein-Argument-Version sind Interrupts und falsche Aufweckvorgänge möglich, und diese Methode sollte immer in einer Schleife verwendet werden:
synchronized (obj) {
while (<condition does not hold>)
obj.wait();
... // Perform action appropriate to condition
}
Diese Methode sollte nur von einem Thread aufgerufen werden, der Eigentümer des Monitors dieses Objekts ist. In der Benachrichtigungsmethode finden Sie eine Beschreibung, wie ein Thread Eigentümer eines Monitors werden kann.
"
1 für die Antwort № 3
Die allgemeinen Regeln lauten wie folgt:
Ein Thread kann nur aufrufen
wait()
odernotify()
als es das Schloss erwarbsynchronized
In zwei Threads kann kein Code ausgeführt werden
synchronized
gleichzeitig blockieren. Die anderen Threads müssen warten, um die Sperre zu erhalten.Wird ein Thread aufgerufen, der die Sperre erwirbt
wait()
gibt es die Sperre automatisch frei. Wenn es warnotify()
Es wird versucht, die Sperre automatisch wieder zu erlangen.
-1 für die Antwort № 4
Werfen Sie einen Blick auf das Cubyhole-Beispiel "Produzent / Verbraucher", es kann helfen
http://www.tutorialspoint.com/javaexamples/thread_procon.htm