David Vlijmincx

Introduction and pitfalls of Java's new concurrency model

Stop writing complex reactive code. Java's virtual threads bring back a simple, scalable thread-per-request model that makes blocking I/O cheap again.

Introduction and pitfalls of Java's new concurrency model
#1about 7 minutes

Understanding Java's traditional platform threads

Traditional platform threads are resource-intensive because they map directly to OS threads, leading to memory limitations and the need for pooling with executor services.

#2about 2 minutes

Introducing lightweight virtual threads in Java 21

Virtual threads are a lightweight, JVM-managed alternative to platform threads that avoid expensive OS calls and use resizable heap memory for their stacks.

#3about 2 minutes

Comparing memory usage of platform vs virtual threads

A comparison shows that while memory usage is similar for a small number of threads, virtual threads use significantly less memory at scale, avoiding out-of-memory errors.

#4about 5 minutes

How to create and manage virtual threads

Virtual threads can be created using the Thread.startVirtualThread() static method, a builder pattern, or the new newVirtualThreadPerTaskExecutor which simplifies lifetime management.

#5about 5 minutes

How virtual threads work with carrier threads

Virtual threads run on a pool of platform threads called carrier threads, and are mounted or unmounted during blocking operations to keep the carrier threads busy.

#6about 2 minutes

Common pitfalls when using virtual threads

Avoid common pitfalls such as expecting faster single-thread performance, using them for long-running CPU-bound tasks, or pooling them, as they are designed to be cheap and disposable.

#7about 6 minutes

The problem structured concurrency solves

Unlike unstructured concurrency which can lead to leaked threads and wasted resources, structured concurrency ensures the lifetime of child threads is confined to a specific code block.

#8about 4 minutes

Implementing a race policy with ShutdownOnSuccess

The ShutdownOnSuccess policy in StructuredTaskScope is used to race multiple tasks and retrieve the result of the first one that completes successfully, canceling the others.

#9about 3 minutes

Implementing an all-or-nothing policy with ShutdownOnFailure

The ShutdownOnFailure policy ensures that all forked tasks must complete successfully; if any task fails, all other running tasks are immediately canceled.

#10about 6 minutes

Creating a custom structured task scope policy

Developers can extend StructuredTaskScope and override the handleComplete method to implement custom shutdown logic based on specific business criteria from task results.

#11about 1 minute

Key takeaways for adopting virtual threads

To get started, developers primarily need to use Thread.startVirtualThread() for single tasks or the newVirtualThreadPerTaskExecutor for managing multiple tasks.

#12about 9 minutes

Q&A on virtual threads, reactive programming, and Java 21

The speaker answers audience questions about replacing Project Reactor, migrating existing applications, using thread-locals, and other new features in Java 21.

Related jobs
Jobs that call for the skills explored in this talk.

Software Engineer

tree-IT GmbH
Bad Neustadt an der Saale, Germany

Remote
Intermediate
Senior

Featured Partners

From learning to earning

Jobs that call for the skills explored in this talk.