Java Concurrency and Multithreading by Jakob Jenkov
Jakob Jenkov · 27 lessons · Free on YouTube
Java Synchronized - The synchronized keyword in Java and Java synchronized blocks and methods
About this course
Modern Java applications rarely run in a quiet, single-threaded world. Web backends handle thousands of requests, data pipelines process streams continuously, and desktop or mobile apps must stay responsive while work happens in the background. This free online course helps you become confident with Java concurrency and multithreading so you can write software that is faster, safer, and easier to scale.
You will learn how threads actually behave in the JVM, how to create and manage them correctly, and when a different approach is a better fit. You will explore virtual threads and what they change for high-throughput, I/O-heavy services, then connect those ideas to the fundamentals that never go away: the Java Memory Model, visibility, ordering, and the happens-before guarantee. With that foundation, concepts like volatile, synchronized blocks, and CPU cache coherence stop feeling like magic and start becoming practical tools you can apply with intention.
As you move forward, the course strengthens your ability to design predictable multithreaded code. You will recognize and prevent race conditions, understand the difference between concurrency and parallelism, and choose strategies that match the problem instead of adding complexity. You will get comfortable with core building blocks used in real systems such as thread pools, locks like ReentrantLock, ThreadLocal, and higher-level execution patterns with ExecutorService, including methods that control how tasks are scheduled and results are retrieved.
You will also learn to spot classic failure modes early. Deadlocks, congestion, and false sharing can quietly destroy performance or reliability; here you will see why they happen and how to avoid them through disciplined structure and simple prevention techniques. The course connects these ideas to scalable coordination patterns like producer-consumer with BlockingQueue, signaling between threads, and efficient parallel execution using ForkJoinPool. By the end, you will be better prepared to reason about concurrency tradeoffs and build Java applications that remain correct under load.
THERE IS ALWAYS MORE