/ / Multithreading sperren und benachrichtigen - Java, Multithreading

Multithreading-Sperre und benachrichtigen - Java, Multithreading

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 № 1

Sie 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() oder notify() als es das Schloss erwarb synchronized

  • 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 war notify()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