🔥 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:
synchronizedReentrantLockCountDownLatch,Semaphore, etc. (anyjava.util.concurrenttool that manages thread handoff)