How to Build a Blocking Queue with Two Condition Variables in Java

The article explains the role of Java's Condition interface as a monitor's condition variable, contrasts it with synchronized's wait/notify, and walks through using two Condition objects to implement a blocking queue that handles empty and full states, illustrating key await/signal patterns.

JavaEdge
JavaEdge
JavaEdge
How to Build a Blocking Queue with Two Condition Variables in Java

In Java, the Condition interface provides condition variables for monitors, allowing multiple distinct wait sets, unlike the single built‑in condition variable used with synchronized.

The combination of Lock and Condition therefore enables a monitor that can manage several condition variables, improving code readability and simplifying implementation.

Blocking queue requires two condition variables

To implement a blocking queue you need to guard two states:

Queue not empty : when the queue is empty, consumer threads must wait before dequeuing.

Queue not full : when the queue reaches its capacity, producer threads must wait before enqueuing.

The typical implementation uses two Condition objects obtained from a ReentrantLock:

ReentrantLock lock = new ReentrantLock();
Condition notEmpty = lock.newCondition();
Condition notFull = lock.newCondition();

Producer threads call await() on notFull when the queue is full and signal notEmpty after inserting an element. Consumer threads call await() on notEmpty when the queue is empty and signal notFull after removing an element.

The semantics of await(), signal() and signalAll() are equivalent to wait(), notify() and notifyAll() used with synchronized, but they must be used only with the Lock / Condition pair. Mixing wait() / notify() with a Lock / Condition monitor will cause runtime errors.

Attempting to call wait() or notify() inside a Lock / Condition based monitor is a common mistake that can lead to serious bugs and even job loss for developers unfamiliar with the correct usage.

Original Source

Signed-in readers can open the original source through BestHub's protected redirect.

Sign in to view source
Republication Notice

This article has been distilled and summarized from source material, then republished for learning and reference. If you believe it infringes your rights, please contactadmin@besthub.devand we will review it promptly.

JavaMonitorConditionBlockingQueue
JavaEdge
Written by

JavaEdge

First‑line development experience at multiple leading tech firms; now a software architect at a Shanghai state‑owned enterprise and founder of Programming Yanxuan. Nearly 300k followers online; expertise in distributed system design, AIGC application development, and quantitative finance investing.

0 followers
Reader feedback

How this landed with the community

Sign in to like

Rate this article

Was this worth your time?

Sign in to rate
Discussion

0 Comments

Thoughtful readers leave field notes, pushback, and hard-won operational detail here.