引言

实现了一个简单的内存缓存:

  1. 元素个数有限
  2. 能自动移除最老的条目
  3. 通过插入顺序遍历它
  4. 是线程安全的集合
  5. 适用于读多写少的场景

基于组合优于继承的思想,封装了LinkedHashMap,并且只有在写操作的时候才进行加锁。

代码

import java.util.*;
import java.util.concurrent.locks.ReentrantLock;/*** 遍历顺序(values()方法)是插入顺序的缓存,并且具有CopyOnWrite性质* @param <K>* @param <V>*/
public class CopyOnWriteCache<K, V> {private  LinkedHashMap<K, V> core;private static final int MAX_ENTRIES = 10000;private final int maxSize;private volatile Map<K, V> view;private final transient ReentrantLock lock = new ReentrantLock();public CopyOnWriteCache() {this(MAX_ENTRIES);}public CopyOnWriteCache(int maxSize) {if (maxSize <= 0) {throw new IllegalArgumentException();}this.maxSize = maxSize;core = new LinkedHashMap<K, V>(maxSize) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > maxSize; //当超过最大条目数时,移除最老的}};}private CopyOnWriteCache(CopyOnWriteCache<K, V> that) {this.core = that.core;this.maxSize = that.maxSize;}public void put(K key, V val) {final ReentrantLock lock = this.lock;lock.lock();try {//拷贝一份老的LinkedHashMap<K, V> newCore = new LinkedHashMap<K, V>(this.core) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > maxSize;}};newCore.put(key, val);this.core = newCore;view = null;} finally {lock.unlock();}}public V get(K key) {return core.get(key);}public void clear() {final ReentrantLock lock = this.lock;lock.lock();try {this.core = new LinkedHashMap<K, V>(this.core) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > maxSize;}};view = null;} finally {lock.unlock();}}public int size() {return core.size();}public Collection<V> values() {return getView().values();}public Set<Map.Entry<K, V>> entrySet() {return getView().entrySet();}public V remove(K key) {final ReentrantLock lock = this.lock;lock.lock();try {LinkedHashMap<K, V> newCore = new LinkedHashMap<K, V>(this.core) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > maxSize;}};view = null;V v = newCore.remove(key);this.core = newCore;return v;} finally {lock.unlock();}}@Overridepublic String toString() {return core.toString();}private Map<K, V> getView() {Map<K, V> result = view;if (result == null) {result = Collections.unmodifiableMap(core);view = result;}return result;}
}

实现简单的Java内存缓存相关推荐

  1. java cache详解,Java内存缓存详解

    1.缓存为什么要存在 应用服务器资源是有限的,数据库每秒中接受请求的次数也是有限的.如果利用有限的资源来提供尽可能大的吞吐量呢,一个办法:减少计 算量,缩短请求流程(减少网络io或者硬盘io),这时候 ...

  2. Java内存缓存-通过Google Guava创建缓存

    谷歌Guava缓存 Guava介绍 Guava是Google guava中的一个内存缓存模块,用于将数据缓存到JVM内存中.实际项目开发中经常将一些公共或者常用的数据缓存起来方便快速访问. Guava ...

  3. Java内存缓存-通过Map定制简单缓存

    缓存 在程序中,缓存是一个高速数据存储层,其中存储了数据子集,且通常是短暂性存储,这样日后再次请求此数据时,速度要比访问数据的主存储位置快.通过缓存,可以高效地重用之前检索或计算的数据. 为什么要用缓 ...

  4. 《深入理解JAVA虚拟机》详细解读(第二章 ):JAVA内存区域与内存溢出异常

    目录 一.JAVA内存区域与内存溢出异常 1. 概述 2. 运行时数据区域 2.1 程序计数器 2.2 Java虚拟机栈 2.3本地方法栈 2.4 堆 2.5 方法区 2.6 运行时常量池 2.7直接 ...

  5. JVM——CPU缓存架构与Java 内存模型

    导航 一.CPU缓存架构与一致性协议 1.1 CPU缓存架构 1.2 缓存行与伪共享问题 1.3 MESI 缓存一致性协议 1.4 伪共享的解决办法 二.JMM Java 内存模型 2.1 JMM 简 ...

  6. Java并发编程(六):从CPU缓存一致性协议到JMM(Java内存模型)

    注:本系列主要注重并发编程这块儿,JVM内容很多,会另外开专栏总结,此系列可能只是会稍微提及 一.跨平台和JVM 经过前面几篇博文的介绍,我们知道,任何编程语言编写的程序要想被计算机执行,都必须被翻译 ...

  7. 高并发编程-通过volatile重新认识CPU缓存 和 Java内存模型(JMM)

    文章目录 概述 volatile定义 CPU缓存 相关CPU术语 CPU缓存一致性协议MESI 带有高速缓存的CPU执行计算的流程 CPU 多级的缓存结构 Java 内存模型 (JMM) 线程通信的两 ...

  8. 并发编程-02并发基础CPU多级缓存和Java内存模型JMM

    文章目录 CPU多级缓存 CPU多级缓存概述 CPU 多级缓存-缓存一致性协议MESI CPU 多级缓存-乱序执行优化-重排序 JAVA内存模型 (JMM) 计算机硬件架构简易图示 JAVA内存模型与 ...

  9. java内存分配模型优点_高并发实战(二)-并发基础 缓存 MESI 内存模型

    左图为高速缓存 右图为多级缓存 数据的读取和存储都经过高速缓存,CPU核心与高速缓存有一条特殊的快速通道.主存与高速缓存都是连接在系统总线上,当然其他组件也是在此基础上进行通信的. 在高速缓存出现后不 ...

  10. Java内存模型JMM简单分析

    参考博文:http://blog.csdn.net/suifeng3051/article/details/52611310 http://www.cnblogs.com/nexiyi/p/java_ ...

最新文章

  1. Linux下安装Oracle11g服务器(centos7下)
  2. [蓝桥杯]PREV-23.历届试题_数字游戏
  3. 谈谈你对集成学习的见解与认识,描述一下它们的优势所在?
  4. C 语言编程 — 静态库、动态库和共享库
  5. 软件需求工程与UML建模——第九组第二周工作总结
  6. PyTorch的损失函数和优化器
  7. java环境配置常用链接
  8. Go语言来了,要代替C和Python?
  9. 第97:一文读懂协方差与协方差矩阵
  10. 长度不超过n的连续最大和___优先队列
  11. 看看老司机是如何提升B端产品架构能力的
  12. wxPython中文教程 简单入门加实例
  13. 【pandas】删除满足条件元素所在的行
  14. java 处理视频帧_如何将视频处理成每帧的图片?.最好是java实现..
  15. VS2005中ajax安装指南
  16. java JDK 8 官网下载网址/清华镜像/华为镜像
  17. 微信公众号调用扫一扫,使扫一扫支持扫PDF417格式的条码
  18. 阿里云的maven仓库配置
  19. 局域网或者本地开发https自签名证书解决办法
  20. 领导想延长我的试用期,我该怎么办?

热门文章

  1. Altium Designer(一):SCH
  2. Linux window查询网络端口
  3. 【转载】HBase实践 | 使用Spark分析云HBase的数据
  4. 论一个蒟蒻的脑子里可以有多少坑(貌似咕了……目前更新保持在noip阶段)
  5. jQuery——入口函数
  6. 数据库中字段的类型选择
  7. 学习笔记28_MVC异步请求
  8. C#创建自定义配置节点
  9. Javascript 四种输出方式
  10. 机器学习(Andrew Ng)作业代码(Exercise 1~2)