我有這樣的事情:緩存<K,BlockingDeque <V>>條紋<Lock>結合:如何鎖定整個緩存
private Striped<ReadWriteLock> stripes = Striped.lazyWeakReadWriteLock(STRIPES_AMOUNT);
private final Cache<Long, BlockingDeque<Peer>> peers = CacheBuilder.newBuilder()
.expireAfterWrite(PEER_ACCESS_TIMEOUT_MIN, TimeUnit.MINUTES)
.build();
每次我進行高速緩存操作,我的幫助下將其鎖定stripes
。
示例#1寫操作]
public void removePeers(long sessionId) {
Lock lock = stripes.get(sessionId).writeLock();
lock.lock();
try {
peers.invalidate(sessionId);
} finally {
lock.unlock();
}
}
例#2的讀操作]
public BlockingDeque<Peer> getPeers(long sessionId) {
Lock lock = stripes.get(sessionId).readLock();
lock.lock();
try {
return peers.getIfPresent(sessionId);
} finally {
lock.unlock();
}
}
例#3 [寫操作]
public boolean addPeer(Peer peer) {
long key = peer.getSessionId();
Lock lock = stripes.get(key).writeLock();
lock.lock();
try {
BlockingDeque<Peer> userPeers = peers.getIfPresent(key);
if (userPeers == null) {
userPeers = new LinkedBlockingDeque<Peer>();
peers.put(key, userPeers);
}
return userPeers.offer(peer);
} finally {
lock.unlock();
}
}
問題:什麼是最有效的方法來鎖定下面的方法?
/**
* I should get the whole peers in cache
*/
public BlockingDeque<Peer> getAllPeers() {
BlockingDeque<Peer> result = new LinkedBlockingDeque<Peer>();
for (BlockingDeque<Peer> deque : peers.asMap().values()) {
result.addAll(deque);
}
return result;
}
如果要鎖定整個緩存,而不是提供弱一致的視圖,則可能必須爲整個緩存添加另一個讀寫鎖。但一個不太一致的觀點可能是可以接受的。 –
@LouisWasserman,但我應該如何將該單獨的r-w鎖與我的「條紋」同步。或者,也許我可以遍歷整個'條紋'並鎖定所有的鎖?你能用例子回答嗎? –