1. Der erste Thread acquired erfolgreich einen Lock auf das Object wait.
2. Der zweite Thread wird gestartet.
Variante A (Der zweite Thread läuft zuerst in den synchronized Block):
3. Der zweite Thread acquired einen Lock auf das Object wait und wartet.
4. Der erste Thread ruft die Methode wait auf dem Object wait auf.
5. Der zweite Thread bekommt den Lock auf das Object wait und läuft weiter.
6. Der zweite Thread ruft die Methode notify auf dem Object wait auf.
7. Der zweite Thread gibt den Lock auf das Object wait frei.
8. Der erste Thread bekommt den Lock auf das Object wait und läuft weiter.
Variante B (Der erste Thread läuft zuerst in die Methode wait):
3. Der erste Thread ruft die Methode wait auf dem Object wait auf und wartet.
4. Der zweite Thread acquired einen Lock auf das Object wait.
5. Der zweite Thread ruft die Methode notify auf dem Object wait auf.
6. Der zweite Thread gibt den Lock auf das Object wait frei.
7. Der erste Thread bekommt den Lock auf das Object wait und läuft weiter.
public class Wait implements Runnable { @Override public void run() { synchronized (this) { notify(); } } public static void main(String[] args) throws InterruptedException { Wait wait = new Wait(); Thread thread = new Thread(wait); synchronized (wait) { thread.start(); wait.wait(); } } }