•
separating the task from the thread, plus the shutdown and awaitTermination protocol
•
CPU-bound work wants roughly core count; blocking IO wants far more
•
and a task failure surfaces wrapped in ExecutionException
•
thenApply, thenCompose and thenCombine, and which thread runs the callback
•
without exceptionally or handle a failed stage is simply never observed
•
striped writes, weakly consistent iteration, and atomic computeIfAbsent
•
compare-and-swap in a retry loop, and the ABA problem behind it
•
the producer-consumer handoff that bounds memory
•
tryLock, fairness, interruptibility and multiple Conditions
•
cheap JVM-scheduled threads that unmount their carrier while blocked on IO
•
create one per task; pooling reintroduces the limit they remove
•
since JDK 24, blocking inside synchronized no longer pins a virtual thread to its carrier
•
immutable dynamic-scope context replaces mutable, leak-prone ThreadLocal state for request data
•
a task scope makes sibling failure, cancellation and lifetime one bounded unit of work
•
an immutable scoped binding instead of a mutable ThreadLocal, and a scope that ties subtask lifetimes to the caller