Вам не нужно для кэширования объектов, однако вы можете сделать это для экономии памяти, ресурсов ввода-вывода, ресурсов ЦП и т. Д.
Память
Например, JVM может кэшировать Integer
объекты, всякий раз, когда вы просите создать новый объект, она может просто возвращать ссылку на уже существующий объект с тем же значением.Узнайте больше о шаблоне Flyweight .
CPU
Вы можете сэкономить ресурсы CPU, сохраняя результаты, для расчета которых требуется много CPU, в кэш-памяти.Связанная техника: Заметки .
Ввод / вывод
Кэшируя некоторые данные в приложении, вы можете сэкономить на вводе / выводе вместо того, чтобы поразить базу данных, жесткий диск,или сеть с каждым доступом.
Запрошенный пример:
Предположим, вы создаете веб-сайт, на котором вам нужно отображать котировки акций, вы будете читать их черезвеб-API (сетевой ввод / вывод) .От вас требуется, чтобы цены обновлялись только раз в минуту (нечастые изменения) .Ваш веб-сайт используется многими пользователями одновременно (параллелизм / многопоточность) .
Кэширующее решение может заключаться в том, чтобы считывать цену акций раз в минуту, а затем хранить ее в поточно-ориентированном режиме.объект.Каждый поток (представляет запросы от ваших одновременных пользователей) будет читать из этого объекта вместо того, чтобы каждый раз обращаться к веб-API (экономия сетевого ввода / вывода) .
Объект является потокомбезопасно, поэтому потоки не будут читать это кэшированное значение в несогласованном состоянии, пока оно обновляется каждую минуту.
Таким образом, каждый из клиентов должен ждать, пока другой клиент завершит свою задачу?
Sidenote: это проблема параллелизма, а не проблема кеширования.
Нет, не обязательно, поскольку существуют поточно-ориентированныеструктуры, которые не будут блокироваться при чтении .Более того, в этом примере есть только один поток, который будет обновлять объект (периодическое обновление цены за одну минуту).
Чтобы уточнить, скажем, мы будем кэшировать эти цены акций в ConcurrentHashMap<String, BigDecimal>
где строка представляет символ акции, "GOOG", "ORCL", "MSFT" и т. Д., А BigDecimal представляет цену / котировку акции.
Для обслуживания вашегопользователи, вы будете читать значения с этой карты следующим образом:
price = quotesMap.get("GOOG"); // get Google stocks quote
Вызов ConcurrentHashMap.get () - это потокобезопасный неблокирующий (не влечущий за собой блокировку) вызов,и ваши несколько потоков могут одновременно выполнять поиск с карты.
Безопасность обеспечивается тем, что на все ваши вызовы get () будет поступать самое последнее завершенное обновление (выполненное по вашей цене).обновление потока при вызове ConcurrentHashMap.put()
для обновления кэша цен.