- 浏览: 64258 次
- 性别:
- 来自: 成都
-
文章分类
最新评论
一个简单的学习多线程缓存的demo:
//计算 public interface Computable<A, V> { V compute(A arg) throws InterruptedException; } /** 第一种最简单实现:采用HashMap,直接在compute()方法上加锁这种构建缓存的方式有很大问题, * 如果compute执行时间很长那么有很多线程都要排队等待,那么此时效率可能比没有缓存还低.*/ public class Momizer1<A, V> implements Computable<A, V>{ private final Map<A, V> cacheMap = new HashMap<A, V>(); private final Computable<A, V> computable; public Momizer1(Computable<A, V> computable){ this.computable = computable; } @Override public synchronized V compute(A arg) throws InterruptedException { V v = cacheMap.get(arg); if(v==null){ v = computable.compute(arg); cacheMap.put(arg, v); } return v; } } /** 第二种实现:用ConcurrentHashMap代替HashMap,由于ConcurrentHashMap是线程安全的且效率比较高,所以比第一种效率高. * 但是这种方式会产生重复计算问题,假如传入相同的值,因为线程间不知道是否已经开始计算,所以都会去计算。*/ public class Momizer2<A, V> implements Computable<A, V>{ private final ConcurrentHashMap<A, V> cacheMap = new ConcurrentHashMap<A, V>(); private final Computable<A, V> computable; public Momizer2(Computable<A, V> computable){ this.computable = computable; } @Override public V compute(A arg) throws InterruptedException { V v = cacheMap.get(arg); if(v==null){ v = computable.compute(arg); cacheMap.put(arg, v); } return v; } } /** 第三种实现:将长时间的计算过程用FutureTask替代,如果FutureTask计算结果完毕,那么直接返回结果, * 如果没有那么久阻塞等待返回结果.但是这种方式还是没有解决重复计算问题,虽然概率远小于第二种方式.因为 * 存在符合操作若没有则添加*/ public class Momizer3<A, V> implements Computable<A, V>{ private final ConcurrentHashMap<A, FutureTask<V>> cacheMap = new ConcurrentHashMap<A, FutureTask<V>>(); private final Computable<A, V> computable; public Momizer3(Computable<A, V> computable){ this.computable = computable; } @Override public V compute(final A arg) throws InterruptedException { FutureTask<V> futureTask = cacheMap.get(arg); // if(futureTask==null){ Callable<V> callable = new Callable<V>() { @Override public V call() throws Exception { return computable.compute(arg); } }; FutureTask<V> f = new FutureTask<>(callable); futureTask = f; cacheMap.put(arg, f); f.run(); /*futureTask = new FutureTask<>(callable); cacheMap.put(arg, futureTask); futureTask.run();*/ } try { return futureTask.get(); } catch (ExecutionException e) { throw new RuntimeException(); } } } /** * 第四种实现:利用ConcurrentHashMap的putIfAbsent方法实现,这个方法相当于如果有就返回值,没有就返回null并讲值放入map. */ public class Momizer4<A, V> implements Computable<A, V> { private final ConcurrentHashMap<A, FutureTask<V>> cacheMap = new ConcurrentHashMap<A, FutureTask<V>>(); private final Computable<A, V> computable; public Momizer4(Computable<A, V> computable) { this.computable = computable; } @Override public V compute(final A arg) throws InterruptedException { while(true){ FutureTask<V> f = cacheMap.get(arg); if(f==null){ Callable<V> callable = new Callable<V>() { @Override public V call() throws Exception { return computable.compute(arg); } }; FutureTask<V> ft = new FutureTask<>(callable); f = cacheMap.putIfAbsent(arg, ft); if(f==null){f=ft;ft.run();} } try { return f.get(); } catch (CancellationException e) { //如果FutureTask调用了取消那么清除缓存重新循环放入 cacheMap.remove(arg); }catch (ExecutionException e) { e.printStackTrace(); } } } }
发表评论
-
读ThreadLocal源代码
2017-10-12 15:00 244//可以存取线程局部变量 //先看构造函数 pub ... -
读Exchanger源码
2017-10-10 11:38 341//用于线程间交换数据 public V exchang ... -
读Executors源码
2017-09-29 15:23 269//一个管理线程创建的类里面都是静态方法 //创建一 ... -
读ScheduledThreadPoolExecutor源码
2017-09-25 17:33 436//一个可以延迟执行的定时任务 //先看构造函数 构造函 ... -
读部分ThreadPoolExecutor源码
2017-09-25 15:27 312//线程池 //先看构造方法 public Threa ... -
读AbstractExecutorService
2017-09-23 16:34 337//他是ExecutorService的部分实现 pub ... -
读ExecutorCompletionService源码
2017-09-23 11:22 493//一个用来管理已完成任务的service,内部封装了一个 ... -
读FutureTask源码
2017-09-22 16:45 276//一个可以异步返回计算的结果 //它同时实现了Futu ... -
读ConcurrentSkipListMap源码
2017-09-21 15:11 304//数据结构是跳表 关于数据结构http://blog.c ... -
读Semaphore源码
2017-09-09 14:58 301//一个信号量,只有在池中还拥有许可时才允许线程继续执行。 ... -
读CyclicBarrier源码
2017-09-01 17:59 359//一个循环的屏障。所有的线程在屏障处等待其他线程执行完毕 ... -
读CountDownLatch源码
2017-09-01 14:01 331//在完成一组操作之前允许一个或多个线程等待内部用的AQS ... -
读ConcurrentLinkedQueue
2017-09-01 11:40 300//这是一个无阻塞的队列没有加任何锁全部利用CAS机制实现 ... -
读ConcurrentHashMap源码
2017-08-31 11:21 284//先看构造函数 public ConcurrentHa ... -
读CopyOnWriteArrayList源码
2017-08-22 12:59 415//在该集合上的写操作都是在原有的副本上进行的操作。这样可 ... -
读LinkedBlockingDeque源码
2017-08-21 14:26 570//这是一个支持双端操作的可阻塞队列 //先看构造函数 ... -
读SynchronousQueue源码
2017-08-10 10:51 379//先看构造方法 public SynchronousQ ... -
读PriorityBlocking源码
2017-08-09 13:47 357//一个基于而为堆的优先级队列,它是无界的。 //先看构 ... -
读DelayQueen源码
2017-08-07 15:16 281//一个基于二叉堆优先 ... -
LinkedblockingQueue源码解读
2017-08-04 13:03 353//LinkedBlockQueue //先看构造函数 ...
相关推荐
数据结构学习
Swift-Int
数据结构学习
操作系统学习
操作系统学习
内容概要:本文档旨在详细介绍如何编写一份详尽的需求规格说明书,涵盖了从产品描述、需求概述到功能细节等多个方面的规范要求。首先,文档明确编写目的、定义产品相关信息,确保读者能够迅速把握文档主旨并理解所讨论的产品背景。其次,在需求概述环节不仅介绍了产品基本功能和发展愿景,还明确了产品运行所需的硬软件环境及其限制。紧接着,功能需求部分则逐一罗列并深入解读各个具体功能点,同时注明未予实现的功能及背后原因,确保后续工作中有据可依。最后,在附录和其他可选项如数据描述、性能和运行需求等章节中继续补充,完善文档信息链,为技术人员提供坚实依据。 适合人群:面向软件开发团队成员(尤其是产品经理、分析师和技术主管),有助于他们高效梳理业务需求并向团队传达清晰的指导方针。 使用场景及目标:用于启动阶段确立项目的范围边界,辅助项目管理者规划任务分工;协助开发者深入理解和遵循既定规则开展编码作业,确保成品符合用户期望值。 阅读建议:鉴于本手册涉及多个层面的规定细则,请使用者先泛读后精读感兴趣的重点章节,同时积极与实际工作相结合,逐步掌握需求采集、整理直至呈现全过程的技术要点和实战技巧。
新增常住人口数量是指在一定时期内(通常为一年),一个地区在某地居住时间达到6个月以上的人口,包括户籍人口和非户籍常住人口的净增长量。
数据结构学习
内容概要:本文展示了将Triplet Attention机制集成到ResNet-18网络架构中,以提升模型对特征的学习能力。首先介绍了Triplet Attention模块的设计思路及其三个分支——通道注意力(Channel Attention)、高度注意力(Height Attention)和宽度注意力(Width Attention)。接着定义了标准的基本残差块并在此基础上增加了自定义的三重注意力机制,最后完成了完整ResNet-18模型的搭建,其中包括输入数据经过一系列卷积操作后的逐步下采样处理以及顶层的全局均值池化层。通过调整num_class参数还可以改变最终输出类别数来适应不同的业务场景。 适用人群:熟悉深度学习基本概念,特别是对CNN(卷积神经网络)有一定了解的研究人员和技术从业者,或者想要深入了解注意力机制的应用的学生。 使用场景及目标:主要用于解决多模态特征提取问题,能够提高计算机视觉应用如图像识别或物体检测的效果,在医学影像诊断、安防监控等领域有广泛应用前景。 其他说明:提供的完整代码可以作为进一步探索此类网络结构的基础工具,并有助于研究人员进行迁移学习实验和其他相
数据结构学习
智慧矿山整体解决方案【42页】
基于C语言+MPU6050六轴传感器位移测算+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C语言+MPU6050六轴传感器位移测算+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于C语言+MPU6050六轴传感器位移测算+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用 基于C语言+MPU6050六轴传感器位移测算+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~ 基于C语言+MPU6050六轴传感器位移测算+源码,适合毕业设计、课程设计、项目开发。项目源码已经过严格测试,可以放心参考并在此基础上延申使用~
数据结构学习
数据结构学习
40个战略咨询模型(41页 图片版 )
操作系统学习
内容概要:本文聚焦于利用深度学习改善卷积神经网络(CNN)在图像识别上的效果。首先介绍了深度学习和图像识别的历史背景和技术现状,并重点讨论了CNN的特点与发展。然后阐述了针对现有CNN模型存在的局限所做出的技术改良,包括架构设计引入残差连接和多尺度特征融合,训练策略上采取自适应学习率调整与数据增强措施,最终构建出了更具竞争力的新模型。该模型经过在CIFAR-10与ImageNet两大数据集上严格的对比测试显示,相较于同类模型有了明显的性能增长,准确率分别提升至95.2%及92.7%,训练耗时减少15%,并且模型体积更轻巧利于部署。文中也提及了图像识别具体案例研究,在医疗图像诊断、安防智能监控系统以及无人驾驶汽车环境感知环节有着重要贡献。 适用人群:对图像识别技术、深度学习感兴趣的科研工作者、高校师生以及从事相关产业技术研发的专业人士。 使用场景及目标:可用于提高各类需要精确快速定位或辨认物体应用场景下系统的运行效能;为涉及计算机视觉业务的企业提供创新性解决方案。 其他说明:文章提到模型仍然存在一些有待解决的问题比如更好的跨域迁移能力和更强的数据安全保护等方面,指明了未来的研发路径,对于
我的图书馆特色藏书推荐
前端分析-2023071100789s122
数据结构学习