Допустим, у меня есть простая карта, которая часто запрашивается, но только очень редко изменяется.В настоящее время я использую синхронизированные блоки для защиты от условий гонки при добавлении на карту (упрощенный пример):
public class MyRepository {
private static HashMap<Integer, Object> MAP = new HashMap<Integer, Object>();
public static Object getInstance(Integer key) {
synchronized (MAP) {
return MAP.get(key);
}
}
public static void addInstance(Integer key, Object instance) {
synchronized (MAP) {
MAP.put(key, instance);
}
}
}
Я не учел какую-то специфическую хрень для приложений, такую как работа с столкновениями клавиш и т.д.просто.Во время выполнения карта заполняется экземплярами при запуске приложения.После этого карта редко когда-либо модифицируется (так сказать, однажды в голубой луне).С другой стороны, карта запрашивается довольно часто, и несколько потоков, запрашивающих карту, блокируют друг друга.
Существует ли механизм защиты, который позволяет нескольким «читателям» одновременно получать доступ к карте, оставаясь при этом одновременнотолько один «писатель» за раз?