Является ли ConcurrentHashMap надежным выбором для использования внутри сервлета? - PullRequest
2 голосов
/ 17 сентября 2011

Мне нужно отобразить объекты внутри сервлета. Является ли ConcurrentHashMap надежным выбором для использования? Все запросы получат запрашиваемый объект с карты или будут сбои?

public class MyServlet extends HttpServlet {

    private Map<String, Object> map = new ConcurrentHashMap<String, Object>();

    public void doGet(HttpServletRequest request, HttpServletResponse response) {
        // use map
        map.get("myObjectName");
    }

}

Ответы [ 3 ]

5 голосов
/ 17 сентября 2011

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

Вы написали

Объекты не модифицируются после запуска сервлета- newbie

Если под этим вы подразумеваете, что карта не изменяется после инициализации сервлета, тогда вам вообще не нужен ConcurrentHashMap.Вы можете использовать старый добрый HashMap.Еще лучше было бы преобразовать ее в неизменяемую карту, используя Collections.unmodifiableMap.

4 голосов
/ 17 сентября 2011

Поскольку карта инициализируется только при запуске, вам следует рассмотреть возможность использования ImmutableMap:

private static final ImmutableMap<String, Object> MY_MAP = ImmutableMap
       .<String, Object>builder()
       .put("asdf", myObj1)
       .put("qwerty", myObj2)
       .build();

. Builder используется для предварительного заполнения картыискомые значения, после чего вызов build() возвращает карту.С этого момента он является неизменным, что делает его потокобезопасным.

Вы также можете использовать фабричные методы of для ограниченного числа пар ключ-значение:

private static final ImmutableMap<String, Object> MY_MAP = ImmutableMap.of(
        "asdf", myObj1,
        "qwerty", myObj2
);
0 голосов
/ 17 сентября 2011

Ответ зависит от того, изменяет ли остальная часть метода карту или нет.

Нет гарантии, что изменения на карте будут КИСЛОТНЫМИ, как написано.

Обычно плохая идея иметь такое общее состояние в сервлете. Они для обработки HTTP-запросов. Лучше перенести эту функцию в службу, которая будет выполнять эту работу.

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