Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   [Java] Thread-Synchronisation (https://www.delphipraxis.net/115658-%5Bjava%5D-thread-synchronisation.html)

Hador 15. Jun 2008 23:29


[Java] Thread-Synchronisation
 
Liste der Anhänge anzeigen (Anzahl: 1)
Code:
  public synchronized ElevatorTask getNextTask() {
    System.out.println("getNextTask called");
    if (tasks.size() == 0) {
      try {
        wait();
      } catch (InterruptedException e) {}
    }
    System.out.println(tasks.size());
    ElevatorTask task = tasks.pollFirst();
    System.out.println("getNextTask calls notify()");
    notify();
    return task;
  }
Durch den Modifier synchronized sollte es ja eigentlich nur einem Thread gestattet sein die Methode aufzurufen. Alle anderen müssen warten bis die Methode abgearbeitet wurde. Eigentlich...

Als Ausgabe bekomme ich jedoch:
Code:
getNextTask called
getNextTask called
addTask called
Also wird getNextTask direkt von 2 Threads gleichzeitig aufgerufen, was daraufhin auch für einen Fehler sorgt.

EDIT: Die Frage ist natürlich: Warum?

Haegar 17. Jun 2008 22:58

Re: [Java] Thread-Synchronisation
 
die Frage is nun auch, wie wo wann wird der Elevator genutzt, wenn 2 threads gleich am anfang getNext versuchen zu verarbeiten, aber noch keine tasks drin sind, legt sich erst der eine schlafen, kritischer abschnitt frei, danach kommt der 2. und legt sich gleich dazu.

wäre mal ein denkbares szenario was die ausgabe erklärt.
und irgendwo gibts den 3. thread der addTask ausführt

phXql 17. Jun 2008 23:33

Re: [Java] Thread-Synchronisation
 
wait() gibt den Lock frei. Liegts daran?

Haegar 17. Jun 2008 23:57

Re: [Java] Thread-Synchronisation
 
ja sicher, mit wait() wird der prozess welcher als die erste Nachricht oben ausgibt schlafen gelegt, den Lock für den Elevator gibt er dabei frei. Somit kann ein 2. Prozess diese Methode aufrufen und ausführen, was 2x obige Nachricht zur Folge hat.


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz