为什么Java对象被缓存?

Jav*_*ser 1 java caching

为什么我们需要缓存Java对象?任何人都可以给我一个需要缓存对象的真实世界示例吗?另外,在多线程执行期间,给出一些关于缓存设计和缓存类型以及缓存结果的观点.在Java中支持缓存的所有API是什么?

为什么我需要单独的缓存API,因为我可以在内存中使用普通的java对象.

bak*_*kal 6

不需要缓存对象,但是您可能希望这样做以节省内存,I/O和CPU资源等.

记忆

例如,JVM可能会缓存Integer对象,每当您要求创建新对象时,它可能只返回对具有相同值的现有对象的引用.阅读有关Flyweight模式的更多信息.

中央处理器

您可以通过在缓存中存储需要大量CPU计算的结果来节省CPU资源.相关技术:记忆.

I/O

通过在应用程序中缓存某些数据,您可以节省I/O,而不是在每次访问时访问数据库,硬盘驱动器或网络.

请求的例子:

假设您正在构建一个需要显示股票报价的网站,您将通过Web API (网络I/O)阅读它们.您只需要每分钟更新一次价格(不经常更改).您的网站被许多用户同时使用(并发/多线程).

缓存解决方案可以是每分钟读取一次股票价格,然后将其保存在线程安全的对象中.每个线程(表示来自并发用户的请求)将从该对象读取,而不是每次都访问Web API(网络I/O节省).

该对象是线程安全的,因此线程在每分钟更新时不会以不一致的状态读取缓存的值.

那么每个客户都需要等待其他客户完成任务?

旁注:这是一个并发问题,而不是缓存问题.

不,不一定,因为有线程安全的结构不会阻止读取.在此示例中,只有一个线程将更新对象(周期性的一分钟价格更新).

详细说明,我们会将这些股票价格缓存ConcurrentHashMap<String, BigDecimal>在字符串代表股票代码的位置,"GOOG","ORCL","MSFT"等,BigDecimal代表股票的价格/报价.

要为您的用户提供服务,您将从该地图中读取值,如下所示:

price = quotesMap.get("GOOG"); // get Google stocks quote
Run Code Online (Sandbox Code Playgroud)

ConcurrentHashMap.get()调用是线程安全的非阻塞(并不意味着锁定)调用,您的多个线程从地图上可以同时做检索.

所有get()调用都会收到最新完成的更新(由您的价格更新线程在调用ConcurrentHashMap.put()更新价格缓存时完成),从而确保安全.