Предположим, у меня есть простая реализация кеша, подобная этой:
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
нет никакого вреда, поскольку она не изменяет данные. Как я могу допустить это, при этом сохраняя структуру безопасности потока?