Skip to content

Instantly share code, notes, and snippets.

@searover
Created June 26, 2020 09:29
Show Gist options
  • Save searover/5610ad67d1f17d9678e5975c5b6395db to your computer and use it in GitHub Desktop.
Save searover/5610ad67d1f17d9678e5975c5b6395db to your computer and use it in GitHub Desktop.
class CacheData {
Object data;
volatile boolean isCacheValid;
final ReadWriteLock rwl = new ReentrantReadWriteLock();
// 读锁
final Lock r = rwl.readLock();
// 写锁
final Lock w = rwl.writeLock();
void processCacheData() {
// 获取读锁
r.lock();
if (!isCacheValid) {
// 缓存无效,释放读锁,因为不允许锁的升级
r.unlock();
// 获取写锁
w.lock();
try {
// 再次检查缓存
if (!isCacheValid) {
data = ...;
isCacheValid = true;
}
// 释放写锁前,降级为读锁,降级是支持的
r.lock();
} finally {
// 释放写锁
w.unlock();
}
// 此处仍然持有读锁
try {
use(data);
} finally {
r.unlock();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment