Защита доступа / синхронизация для сильно читаемой, но редко изменяемой коллекции? - PullRequest
0 голосов
/ 21 декабря 2010

Допустим, у меня есть простая карта, которая часто запрашивается, но только очень редко изменяется.В настоящее время я использую синхронизированные блоки для защиты от условий гонки при добавлении на карту (упрощенный пример):

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);
        }
    }

}

Я не учел какую-то специфическую хрень для приложений, такую ​​как работа с столкновениями клавиш и т.д.просто.Во время выполнения карта заполняется экземплярами при запуске приложения.После этого карта редко когда-либо модифицируется (так сказать, однажды в голубой луне).С другой стороны, карта запрашивается довольно часто, и несколько потоков, запрашивающих карту, блокируют друг друга.

Существует ли механизм защиты, который позволяет нескольким «читателям» одновременно получать доступ к карте, оставаясь при этом одновременнотолько один «писатель» за раз?

Ответы [ 3 ]

5 голосов
/ 21 декабря 2010

Вы смотрели объявление ConcurrentHashMap из JDK 5?Это предназначено для этого варианта использования

1 голос
/ 22 декабря 2010

ConcurrentHashMap, вероятно, будет вашим лучшим решением.Однако, если записи выполняются очень редко, вы можете сохранить две копии: главную копию, которую вы синхронизируете, и вторую карту, которая является копией, которая заменяется каждый раз, когда вы меняете первую карту.Это делает запись очень дорогой, но читает так же дешево, как и отсутствие блокировки.

1 голос
/ 21 декабря 2010

Как насчет ReadWriteLock ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...