如何允许从同步结构中同时读取?
How to allow simultaneous reads from a synchronized structure?
假设我有一个像这样的简单缓存实现:
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
,这似乎很容易做到。
展开。这是如何应用 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();
}
}
}
假设我有一个像这样的简单缓存实现:
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
,这似乎很容易做到。
展开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();
}
}
}