# Nachdenkzettel: Threads

Betrachten Sie folgenden Code:

```java
public class ThreadDemo {

	static final Object LOCK_A = new Object();
	static final Object LOCK_B = new Object();

	public static void main(String[] args) throws InterruptedException {
		Thread t1 = new Thread(() -> {
			synchronized (LOCK_A) {
				sleep(50);
				synchronized (LOCK_B) {
					System.out.println("t1 finished");
				}
			}
		}, "t1");

		Thread t2 = new Thread(() -> {
			synchronized (LOCK_B) {
				sleep(50);
				synchronized (LOCK_A) {
					System.out.println("t2 finished");
				}
			}
		}, "t2");

		t1.start();
		t2.start();

		t1.join();
		t2.join();
		System.out.println("done");
	}

	static void sleep(long ms) {
		try {
			Thread.sleep(ms);
		} catch (InterruptedException e) {
			Thread.currentThread().interrupt();
		}
	}
}
```

### 1. Programmverständnis

Führen Sie das gegebene Programm mehrfach aus.

- Beschreiben Sie präzise, was Sie beobachten.
- Beschreiben Sie den Zustand der beteiligten Threads.
- Recherchieren Sie, wie man dieses Verhalten nennt.
- Begründen Sie, warum das Programm dieses Verhalten zeigt.

### 2. Korrektur 

Verändern Sie den Code so, dass das beobachtete Problem nicht mehr auftritt

- Die grundlegende Struktur (zwei Threads, zwei Sperrobjekte) bleibt erhalten.
- Das Programm soll zuverlässig terminieren.
- Begründen Sie Ihre Änderung.
  
