假设我有一个简单的缓存实现,如下所示:
class Cache<Item> {
private InternalStorage internalStorage;
public synchronized Collection<Item> find(String query) {
// find Items from internalStorage
}
public synchronized void add(Collection<Item> items) {
// Add items to internalStorage
}
}
我需要阻止:
internalStorage
。即没有同时打电话给add
。find
和add
。上面的实现满足了这些安全要求,但是,同时调用find
没有任何危害,因为它不会改变数据。我怎样才能允许这一点,同时仍保持结构线程安全?
如果你在这里使用ReentrantReadWriteLock
而不是synchronized
,这似乎相当容易。
扩展Eugene's answer。这是如何应用ReentrantReadWriteLock
来实现我所需要的:
class Cache<Item> {
final ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
private Map<String, Item> internalStorage;
public Collection<Item> find(String query) {
rwl.readLock().lock();
try {
// find Items from internalStorage
// ...
return result;
} finally {
rwl.readLock().unlock();
}
}
public void add(Collection<Item> items) {
rwl.writeLock().lock();
try {
// Add items to internalStorage
// ...
} finally {
rwl.writeLock().unlock();
}
}
}