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.

Featured Partners

From learning to earning

Jobs that call for the skills explored in this talk.

Java Developer

Java Developervanloq Limited
Belfast, United Kingdom

GIT
Java
Spring
MongoDB
Scripting (Bash/Python/Go/Ruby)

Scala Developer

Future Horizons
Municipality of Madrid, Spain

Remote
Java
Kafka
Kubernetes
Microservices
+1