Какой шаблон или метод лучше всего загрузить статический кеш? ⇐ JAVA
-
Anonymous
Какой шаблон или метод лучше всего загрузить статический кеш?
Предположим, у меня есть следующее (предположим, что оно ограничено Java 1.4, поэтому нет дженериков):
публичный класс CacheManager { статические состояния HashMap; статические логические состоянияLoaded; public static String getState(String abbrev) { если(!stateLoaded) { ЗагрузитьСостояния(); } return (String) States.get(abbrev); } частная статическая сила loadStates() { //JDBC-материал для загрузки данных штатыLoaded = правда; } } В многопоточной среде с высокой нагрузкой, такой как сервер веб-приложений, теоретически могут возникнуть проблемы, если > 1 поток пытается получить и загрузить кеш одновременно. (Предполагаем, что в веб-приложении нет стартового кода для инициализации кеша)
Достаточно ли просто использовать Collections.synchronizedMap, чтобы это исправить? Есть ли проблемы с производительностью возвращаемого SynchronizedMap при выполнении get(), если к нему обращается множество потоков?
Или было бы лучше иметь несинхронизированный HashMap и вместо этого синхронизировать метод загрузки или логическую переменную? Я думаю, что если вы синхронизируете любой из них, вы можете заблокировать класс.
Например, если метод загрузки был синхронизирован, что, если 2 потока одновременно войдут в метод getStates() и оба увидят, чтоstateLoaded имеет значение false. Первый получает блокировку метода, загружает кеш и устанавливает дляstateLoaded значение true. К сожалению, второй поток уже оценил, чтоstateLoaded было ложным, и переходит к методу загрузки, как только блокировка будет освобождена. Разве он не продолжит загрузку кэша еще раз?
Предположим, у меня есть следующее (предположим, что оно ограничено Java 1.4, поэтому нет дженериков):
публичный класс CacheManager { статические состояния HashMap; статические логические состоянияLoaded; public static String getState(String abbrev) { если(!stateLoaded) { ЗагрузитьСостояния(); } return (String) States.get(abbrev); } частная статическая сила loadStates() { //JDBC-материал для загрузки данных штатыLoaded = правда; } } В многопоточной среде с высокой нагрузкой, такой как сервер веб-приложений, теоретически могут возникнуть проблемы, если > 1 поток пытается получить и загрузить кеш одновременно. (Предполагаем, что в веб-приложении нет стартового кода для инициализации кеша)
Достаточно ли просто использовать Collections.synchronizedMap, чтобы это исправить? Есть ли проблемы с производительностью возвращаемого SynchronizedMap при выполнении get(), если к нему обращается множество потоков?
Или было бы лучше иметь несинхронизированный HashMap и вместо этого синхронизировать метод загрузки или логическую переменную? Я думаю, что если вы синхронизируете любой из них, вы можете заблокировать класс.
Например, если метод загрузки был синхронизирован, что, если 2 потока одновременно войдут в метод getStates() и оба увидят, чтоstateLoaded имеет значение false. Первый получает блокировку метода, загружает кеш и устанавливает дляstateLoaded значение true. К сожалению, второй поток уже оценил, чтоstateLoaded было ложным, и переходит к методу загрузки, как только блокировка будет освобождена. Разве он не продолжит загрузку кэша еще раз?
Мобильная версия