🔥 Quick Recap — What is ReentrantLock
?
ReentrantLock
is part of java.util.concurrent.locks
and is a more flexible, feature-rich alternative to synchronized
blocks. It allows:
✅ Try-lock (non-blocking lock attempts)
✅ Timeouts (wait only so long for a lock)
✅ Fairness policies (FIFO locking)
🔎 Does ReentrantLock
flush to RAM directly?
✅ YES — but indirectly!
When a thread acquires a ReentrantLock
, the Java Memory Model guarantees:
All changes made by threads before releasing the lock are visible to threads after acquiring the lock.
This is exactly the same happens-before relationship provided by synchronized
.
How?
- Before a thread releases the lock, it must flush all changes to main memory.
- When a thread acquires the lock, it invalidates its cache and must read fresh values from main memory.
This is a critical visibility guarantee.
💡 ReentrantLock vs synchronized
vs volatile
(Visibility)
Tool | Flushes to Memory? | Notes |
---|---|---|
volatile | ✅ Yes | Every read & write directly to/from RAM |
synchronized | ✅ Yes | On entering (read fresh) and exiting (flush changes) |
ReentrantLock | ✅ Yes | On lock() (read fresh) and unlock() (flush changes) |
🧵 Why is this needed?
Without this memory flush, thread A could modify data, acquire a lock, and thread B could acquire the lock — but B might see stale data unless this flushing happens.
🚀 Example — How ReentrantLock
Ensures Visibility
class SharedResource {
private int count = 0;
private final ReentrantLock lock = new ReentrantLock();
public void increment() {
lock.lock();
try {
count++; // All changes here are flushed to main memory when lock is released
} finally {
lock.unlock();
}
}
public int getCount() {
lock.lock();
try {
return count; // Always fresh read from memory after lock acquisition
} finally {
lock.unlock();
}
}
}
💡 Summary Rule of Thumb
Tool | Visibility Guarantee | Atomicity Guarantee |
---|---|---|
volatile | ✅ Immediate memory visibility | ❌ No atomicity (only individual reads/writes are safe) |
synchronized | ✅ Visibility on enter/exit | ✅ Atomicity for the critical section |
ReentrantLock | ✅ Visibility on lock/unlock | ✅ Atomicity for the critical section |
✅ Final Takeaway
Case | Best Tool |
---|---|
Simple flag (e.g., stop flag) | volatile |
Critical section (multi-variable, multiple operations) | synchronized or ReentrantLock |
Need advanced features (tryLock, fairness) | ReentrantLock |
🚨 Important Note
This flush to memory is part of the Java Memory Model — it’s guaranteed by the spec when using proper synchronization tools like:
synchronized
ReentrantLock
CountDownLatch
,Semaphore
, etc. (anyjava.util.concurrent
tool that manages thread handoff)