Welche der folgenden Aussagen über das @FunctionalInterface Annotations-Konzept ist korrekt?
- [ ] Ein Functional Interface muss zwingend mit @FunctionalInterface annotiert sein, um als Lambda-Ziel zu dienen.
- [x] Ein Functional Interface darf genau eine abstrakte Methode haben, aber beliebig viele default- oder static-Methoden.
- [ ] Ein Functional Interface darf keine Methoden von java.lang.Object überschreiben.
- [ ] Abstract Classes mit nur einer abstrakten Methode sind ebenfalls Functional Interfaces.

---

Was passiert, wenn eine Lambda-Expression versucht, eine lokale Variable der umschließenden Methode zu ändern?
- [ ] Die Variable wird automatisch atomar (atomic) behandelt.
- [ ] Es funktioniert nur, wenn die Variable als volatile deklariert ist.
- [x] Es tritt ein Kompilerfehler auf, da Variablen, die in Lambdas verwendet werden, "effectively final" sein müssen.
- [ ] Die Änderung ist nur innerhalb des Lambdas sichtbar, nicht außerhalb.

---

Was garantiert das Schlüsselwort 'volatile' in Java bezüglich des Threading-Modells?
- [ ] Es verhindert Race Conditions bei nicht-atomaren Operationen wie i++.
- [x] Es stellt sicher, dass Schreibvorgänge in die Variable direkt im Hauptspeicher erfolgen und für andere Threads sofort sichtbar sind.
- [ ] Es sperrt das Objekt für die Dauer des Zugriffs (impliziter Lock).
- [ ] Es erzwingt, dass die Variable im CPU-Cache des jeweiligen Kerns bleibt.

---

Welcher Typ von ThreadPool sollte verwendet werden, wenn eine sehr große Anzahl kurzlebiger asynchroner Aufgaben ausgeführt werden soll?
- [ ] Executors.newFixedThreadPool(10)
- [x] Executors.newCachedThreadPool()
- [ ] Executors.newSingleThreadExecutor()
- [ ] Executors.newScheduledThreadPool(1)

---

Was ist der Hauptvorteil der "Initialization-on-demand holder idiom" (Bill Pugh Singleton) gegenüber Double-Checked Locking?
- [ ] Es benötigt weniger Speicherplatz.
- [x] Es nutzt die Thread-Sicherheit des Classloaders und benötigt kein synchronisiertes Locking oder volatile.
- [ ] Es erlaubt das Lazy-Loading auch bei serialisierbaren Objekten ohne Zusatzaufwand.
- [ ] Es ist das einzige Muster, das Reflection-Angriffe verhindert.

---

Was ist ein potenzieller Nachteil bei der Verwendung von .parallelStream() auf einer LinkedList?
- [ ] Die LinkedList wird automatisch in eine ArrayList konvertiert, was Zeit kostet.
- [ ] LinkedList unterstützt kein paralleles Processing.
- [x] Die Performance ist schlecht, da LinkedLists schwer effizient zu splitten sind (schlechter Spliterator).
- [ ] Es führt immer zu einer ConcurrentModificationException.

---

Welche Methode von CompletableFuture wird verwendet, um zwei unabhängige Futures zu kombinieren, wenn das Ergebnis beider für einen weiteren Schritt benötigt wird?
- [ ] thenApply()
- [ ] thenCompose()
- [x] thenCombine()
- [ ] applyToEither()

---

Was ist der fundamentale Unterschied zwischen dem Strategy- und dem State-Pattern?
- [ ] Es gibt keinen Unterschied, sie sind identisch.
- [ ] Strategy wird zur Laufzeit gewechselt, State nur beim Kompilieren.
- [x] Beim State-Pattern kennen die Zustände oft die anderen Zustände und lösen Übergänge selbst aus; beim Strategy-Pattern ist die Logik unabhängig.
- [ ] Das State-Pattern ist ein Creational Pattern, Strategy ein Behavioral Pattern.

---

Warum kann man in Java keinen Array von generischen Typen erstellen (z.B. new T[10])?
- [ ] Weil Generics nur für Collections gedacht sind.
- [ ] Weil Arrays zur Laufzeit nicht existieren.
- [x] Aufgrund der Type Erasure stehen die Typinformationen zur Laufzeit nicht zur Verfügung, um die Typsicherheit des Arrays zu prüfen.
- [ ] Weil die JVM nicht genügend Heap-Speicher für generische Arrays reservieren kann.

---

Was beschreibt das Prinzip des "Work-Stealing" im ForkJoinPool am besten?
- [ ] Threads stehlen Rechenzeit vom Betriebssystem.
- [x] Leerlaufende Threads "stehlen" Aufgaben vom Ende der Deques (Double-Ended Queues) beschäftigter Threads.
- [ ] Aufgaben werden prioritätsbasiert von anderen Threads übernommen.
- [ ] Es handelt sich um einen Sicherheitsfehler im Java-Thread-Modell.