!Einfache Thread Synchronisierung
__Ablauf:__

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();
		}
	}
}
}}}