Created
June 26, 2020 09:29
-
-
Save searover/5610ad67d1f17d9678e5975c5b6395db to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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