1. LinkedHashMap实现LRU缓存

LRU缓存核心是根据访问顺序排序, 自动移除队尾缓存, LinkedHashMap已经实现了这些要求:

public LRUCache<K, V> extends LinkedHashMap<K, V> {
private int cacheSize; public LRUCache(int cacheSize){
super(16, 0.75, true); // key1: true表示使用访问排序, 默认false表示插入排序
}
@Override
protected boolean removeEldestEntry(Map.Entry<k, V> eldest){
return size() >= cacheSize; //key2: 每次调用add后, 底层都会调用这个方法判断是否执行移除队尾元素, 通过重写这个方法来控制移除时机
}
}

2.InvocationHandler实现动态代理

手工为每一个类实现一个代理类称为静态代理, 缺点是即使代理的操作是一样的, 仍然要为每个类实现一个代理类, 代理操作代码不能复用

//1.实现代理类
public class MyInvocationHandler implements InvocationHandler {
private Object target; MyInvocationHandler() {
super();
} MyInvocationHandler(Object target) {
super();
this.target = target;
} @Override
public Object invoke(Object o, Method method, Object[] args) throws Throwable {
if("getName".equals(method.getName())){
System.out.println("++++++before " + method.getName() + "++++++");
Object result = method.invoke(target, args);
System.out.println("++++++after " + method.getName() + "++++++");
return result;
}else{
Object result = method.invoke(target, args);
return result;
}
} //2.获得代理对象
(TargetInterface)Proxy.newProxyInstance(tarInterClass.getClassLoader(), tarInterClass.getInterface(), new MyInvocationHandler(tarObj));

可以看出Proxy.newProxyInstance()获得的是对一个接口的代理, 这也是InvocationHandler动态代理的缺点:只能代理接口中的方法.

想代理类中非implement接口的方法, 可以用第三方Cglib代理实现

3.fork/join实现窃取模式

窃取模式是一种升级版的生产者-消费者模式, 特点是线程在处理完自己的任务队列后, 回去其他线程的任务队列的末尾窃取任务来执行, 以提高效率.

如果自己实现窃取模式:首先要一个线程池来执行任务, 其次要为每一个线程提供一个任务队列, 最后还要实现窃取其他队列的任务的功能. 幸运的是JAVA已经提供了实现.

//1.编写任务类implement
RecursiveAction 不反回结果, 相当于Runnable
RecursiveTask 返回结果, 相当于Callable
//2.获得线程池
ForkJoinPool pool = new ForkJoinPool()
//3.提交任务
pool.execute() 异步执行命令
pool.invoke() 执行命令并直接返回结果
pool.submit() 执行任务并返回一个ForkJoinTask(Future)
//4.子RecusiveAction
fork() //把自身添加到任务执行队列
join() //获得执行结果

在compute()的实现中, 根据条件将任务分成更细的多个RecusiveTask, 就实现了分治法

  

总是套路留人心, JAVA提供的套路: LinkedHashMap实现LRU缓存; InvocationHandler实现动态代理; fork/join实现窃取算法的更多相关文章

  1. Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理

    Java之美[从菜鸟到高手演练]之JDK动态代理的实现及原理 JDK动态代理的实现及原理 作者:二青 邮箱:xtfggef@gmail.com     微博:http://weibo.com/xtfg ...

  2. 【Java EE 学习 15】【自定义数据库连接池之动态代理的使用】

    一.动态代理的作用 使用动态代理可以拦截一个对象某个方法的执行,并执行自定义的方法,其本质是反射 优点:灵活 缺点:由于其本质是反射,所以执行速度相对要慢一些 二.数据库连接池设计思想 1.为什么要使 ...

  3. Java集合详解5:深入理解LinkedHashMap和LRU缓存

    今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 摘要: HashMap和双向链表合二为一即是LinkedHashMap.所谓Linke ...

  4. 请用Java设计一个Least Recently Used (LRU) 缓存

    LRU介绍:LRU是Least Recently Used的缩写,即最少使用页面置换算法,是为虚拟页式存储管理服务的, 思路介绍: 能够使用两个标准的数据结构来实现.Map和Queue.由于须要支持多 ...

  5. java中动态代理实现机制

    前言: 代理模式是常用的java设计模式,它的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常会存在关联关系 ...

  6. JAVA动态代理模式(从现实生活角度理解代码原理)

    所谓动态代理,即通过代理类:Proxy的代理,接口和实现类之间可以不直接发生联系,而可以在运行期(Runtime)实现动态关联. java动态代理主要是使用java.lang.reflect包中的两个 ...

  7. 使用Java中的动态代理实现数据库连接池

    2002 年 12 月 05 日 作者通过使用JAVA中的动态代理实现数据库连接池,使使用者可以以普通的jdbc连接的使用习惯来使用连接池. 数据库连接池在编写应用服务是经常需要用到的模块,太过频繁的 ...

  8. 代理模式 & Java原生动态代理技术 & CGLib动态代理技术

    第一部分.代理模式  代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负责为委托类预处理消息.过滤消息.把消息转发给委托类,以及事后处理消息等.代理类与委托类之间通常 ...

  9. Java JDK 动态代理使用及实现原理分析

    转载:http://blog.csdn.net/jiankunking   一.什么是代理? 代理是一种常用的设计模式,其目的就是为其他对象提供一个代理以控制对某个对象的访问.代理类负责为委托类预处理 ...

随机推荐

  1. cuda中用cublas库做矩阵乘法

    这里矩阵C=A*B,原始文档给的公式是C=alpha*A*B+beta*C,所以这里alpha=1,beta=0. 主要使用cublasSgemm这个函数,这个函数的第二个参数有三种类型,这里CUBL ...

  2. ORACLE-SQL微妙之处

    本文总结一下平时经常使用的SQL语句以及一些ORACLE函数的微妙之处.欢迎大家多多补充平时最常用的SQL语句,供大家学习参考. SQL> select * from temp2; NAME S ...

  3. jqgrid 使用altRows和altclass属性实现隔行换色

    如果只是简单的区别奇偶行的话,设置两个属性,加一个样式 altRows:true, altclass:'someClass' .someClass { background-color: #DDDDD ...

  4. Linux 安装MongoDB 并设置防火墙,使用远程客户端访问

    1. 下载 MongoDB 提供了 linux 各发行版本 64 位的安装包  下载地址:https://www.mongodb.com/download-center#community 2. 安装 ...

  5. 安装SQL sever2008时显示重新启动计算机规则失败,应该怎么解决?

    1.删除注册表:在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager中找到 PendingFileRenameOpe ...

  6. java8时间操作

    import java.time.*; import java.util.Date; /** * @Auther kejiefu * @Date 2018/5/17 0017 */ public cl ...

  7. Resource View Window of Visual Studio

    https://msdn.microsoft.com/en-us/library/d4cfawwc.aspx For the latest documentation on Visual Studio ...

  8. 嵌入式开发板LInux更新系统、安装软件、下载资源碰到的问题

    CAfile: /etc/ssl/certs/ca-certificates.crt CRLfile: none 先同步系统时间 shell 输入命令 date 如果显示的时间跟你本地时间不一样,先设 ...

  9. js 排序,去重

    前几天 有一个需求要做一个 勾选的按钮 ,用的前端框架时 extjs   . 需求是这样的:选择数据后点击勾选 会把数据 放到一个全局变量里,然后点击另外一个提交按钮 弹出一个窗口 加载这些已经勾选的 ...

  10. vs2008编译openssl,静态库/动态库,批处理

    ::前期准备准备工作::1,下载安装好ActivePerl,::2,下载Openssl源码::3,本机有安装vc::4,此例在vs2008(vc9),openssl-1.0.2o下完成 echo of ...