首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    使用ConcurrentHashMap实现高效缓存框架

    就像许多重复发明的轮子一样,缓存框架的设计看上去简单,但系统的性能将会由缓存框架的伸缩性决定。...,并且将其替换给当前线程中的局部变量f,并且其判断f不为null,那么其会调用f::get()方法,而此时第一个线程正在执行FutureTask::run方法,如果其已经计算完成,那么其会返回结果给第一个线程...,而第二个线程是直接执行的FutureTask::get方法,如果第一个线程执行完成,那么第二个线程将直接获取结果返回,如果第一个线程没有执行完成,那么第二个线程将等待第一个线程执行完成后再返回结果。...而对于某个执行计算结果的线程而言,如果其计算过程被取消或失败,那么对于缓存而言这就造成了缓存污染,因为存入的是FutureTask对象,而不是真正的结果,如果计算的线程被取消,那么实际上FutureTask...::get方法将一直无法获取到值,但是cache中对应键的值也不是null的,这就是缓存污染的根源。

    1.5K20

    GuavaCache学习笔记三:底层源码阅读

    3.refreshAfterWrite 指明每个数据实体:当 创建 或 写 之后的 固定值的有效期到达时,数据会被自动刷新(注意不是删除是异步刷新,不会阻塞读取,先返回旧值,异步重载到数据返回后复写新值...因为垃圾回收仅依赖恒等式(==),使用弱引用键的缓存用==而不是equals比较键。 CacheBuilder.weakValues():使用弱引用存储值。...因为垃圾回收仅依赖恒等式(==),使用弱引用值的缓存用==而不是equals比较值。 CacheBuilder.softValues():使用软引用存储值。...使用软引用值的缓存同样用==而不是equals比较值。...4)显式清除:任何时候,你都可以显式地清除缓存项,而不是等到它被回收,具体如下 个别清除:Cache.invalidate(key) 批量清除:Cache.invalidateAll(keys) 清除所有缓存项

    1.1K20

    死磕 java线程系列之线程池深入解析——未来任务执行流程

    FutureTask实现了RunnableFuture接口,而RunnableFuture接口组合了Runnable接口和Future接口的能力,而Future接口提供了get任务返回值的能力。...问题:submit()方法返回的为什么是Future接口而不是RunnableFuture接口或者FutureTask类呢?...答:这是因为submit()返回的结果,对外部调用者只想暴露其get()的能力(Future接口),而不想暴露其run()的能力(Runaable接口)。...; 问题:为什么要在for循环中控制整个流程呢,把这里的每一步单独拿出来写行不行?...(1)如果正常执行结束,则返回任务的返回值; (2)如果异常结束,则包装成ExecutionException异常抛出; 通过这种方式,线程中出现的异常也可以返回给调用者线程了,不会像执行普通任务那样调用者是不知道任务执行到底有没有成功的

    57310

    Future Java

    摘要 什么是Future 为什么需要Future Java中的Future模式 详解FutureTask 1. 什么是Future Future是多线程开发中常见的一种设计模式。...Future模式可以返回线程执行结果的契约,通过此契约程序可以选择在合适的时机取回执行的结果,如果取回结果时线程还没有执行完成,将会阻塞调用线程等待执行结果返回。 2....为什么需要Future 在有些场景下,我们想使用另一个线程去执行复杂耗时的操作,此时又不想让主线程等待白白浪费CPU,此时可以让主线程先去做别的事,然后在合适的时机去通过Future契约取回线程执行的结果...3.1 Callable & Runnable 这是我们普通的线程任务,其中Callable是带返回值(真实数据),Runnable是不带返回值的,因此在我们使用Runnable和Future时,必须传入一个...} else LockSupport.park(this); } } 获取结果的大致步骤如下: 检测任务状态是否是NEW或者COMPLETING,如果不是

    43220

    Java多线程-Furetue接口源代码详解

    如果计算被取消了,那么返回异常:ancellationException,如果计算本身抛出了异常,则抛出ExecutionException,如果在当前线程等待计算完成的过程中当前线程被中断了,则抛出:...一个ForkJoinTask是类似于线程实体,但是相对于线程实体是轻量级的。大量的任务和子任务会被ForkJoinPool池中的真实线程挂起来,以某些使用限制为代价。.... */ void run(); }  由上述代码可知,RunnableFuture只是继承了两个接口Runnable以及Future,没有实现父接口的任何方法(这是使用继承而不是实现的原因...,而不是放置任务的,在2.2节中会详细描述。...按照此思路,Fork/Join框架,ForkJoinPool类的负责执行任务的最小单元就是FutureTask类对象。详细的ForkJoinPool类和Fork/Join框架请看下一章分析。

    59910

    java线程池(七):ForkJoinPool源码分析之三(ForkJoinTask源码)

    包括取消任务而未执行的情况。如果没有完成任务,则isCompletedNormally返回true。 如果任务已取消,isCancelled返回true。...ForkJoinTasks是可序列化的,使得它们可以在远程执行的框架中扩展使用,仅在执行前或者之后而不是之前期间序列化任务是明智的。执行本身不依赖于序列化。 类结构如下: ?...= null) throw new ExecutionException(ex); //默认返回结果是getRawResult。...2.3.2 join 返回isDone的时候的计算结果,此方法与get的不同之处在于,异常完成会导致RuntimeException。或者Error,而不是ExecutionException。...且调用线程的中断不会导致方法通过抛出InterruptedException而突然返回。

    1.1K30

    一文读懂《Effective Java》第43条:返回零长度的数组或集合,而不是null

    对于一个返回null 而不是零长度数组或者集合的方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回值的代码,进而导致NPE。...返回值为null 与性能 有时候会有程序员认为:null 返回值比零长度数组更好,因为它避免了分配数组所需要的开销,但这种观点站不住脚。...在返回值这种级别上担心性能问题是不明智的,除非分析表明这个方法是造成性能问题的真正源头 对于不返回任何元素的调用,每次返回同一个零长度数组是有可能的,因为零长度数组不可变的,而不可变对象可能被自由的共享...,没理由返回null,二是返回一个零长度的数组或者集合。...Java 的返回值为null 的做法,很可能是从C 语言沿袭过来的,在C 中,数组长度是与实际的数组分开返回的,如果返回的数组长度为0,再分配一个数组就没有任何好处了。

    1.9K20

    框架篇-Vue面试题1-为什么 vue 组件中的 data 是函数而不是对象

    如下所示 export default { data: { // data是一个对象 name: 'itclanCoder', }, }; 当一个组件被定义,data必须声明为返回一个初始数据对象的函数...如果data是一个纯碎的对象,则所有的实例将共享引用同一份data数据对象,无论在哪个组件实例中修改data,都会影响到所有的组件实例 如果data是函数,每次创建一个新实例后,调用data函数,从而返回初始数据的一个全新副本数据对象...这样每复用一次组件,会返回一份新的data数据,类似于给每个组件实例创建一个私有的数据空间,让各个组件的实例各自独立,互不影响,保持低耦合 可以看下面一段代码 // 声明构造器函数 function...console.log(p1.data.name); // 川川 console.log(p1.data.name); // 川川 挂载在原型下属性如果是一个对象,实例化出来的对象(p1,p2)都指向的是同一份实体

    2.2K20

    java – 为什么InputStream#read()返回一个int而不是一个字节?

    但是为何方法InputStream#read()需要返回int类型值呢?...首先,我们要完成一个EOF(End of File)判断,在Java中就是以-1来表示数据读完了,但是如果返回的char类型值,那么根本没有-1这个数值;如果换种方式,返回一个特殊的char值,比如char...中的-1值,那么就占用了此字符,如果字节数据恰好对应-1值,那么就无法被正确读出,且会被错误认为i字节数据读好了,这就是返回int类型值的原因,当然,字节数据被转为int表示,需要高24位布零。...其次,既然只是如上的需求,那么为什么不返回short值呢? 实际上在Java内存模型中,对于short以及int类型值,都是占据32位的内存空间的。...换言之,我们没有在这个应用中返回int/short类型的数据是没有区别的,所以我们不妨就使用代表其实际内存模型的int类型值。

    1.4K20

    初识字节流+实现缓冲字节流OutputStream的主要方法构造方法读关流实现BufferedInputStream实现BufferedOutputStream为什么read()返回的是Int型而不是

    filename.isFile()==false的话,那么会抛出FileNotFoundException 读 read():int read(byte[] array):int 与Reader类一样,如果到了文件末尾,返回...-1 这里有个特别好用的方法,可以用来知道文件的大小 available():int; 返回文件的字节数 这时就可以用这个方法来定义array的大小,那么就可以一次性读完了 关流 flush...){return -1;} } len--; return (array[index++]&255);//防止出现读到11111111此时错误的返回了...---- 错误的返回了-1 如果扫描到了11111111那么此时将byte->int是-1,如果这样的话,程序就会终止不会进行 为什么read()返回的是Int型而不是byte型呢??

    1.4K80

    我靠(call) ,我的未来(Future)在哪里???

    你可能会说,这两个难道不是一个问题吗?任务执行了就会有返回结果,而返回结果也一定是任务执行了才返回的,难道还能返回一个其他任务的结果么??...本文将分为两个部分,第一部分分别介绍 任务、执行、以及结果这三个概念在 Java API 中的实体和各自的继承关系,第二部分通过一个简单的例子回顾他们的用法,再理解下这两个问题的答案。...如果任务没有需要返回的结果,那么将泛型 V 设为 void 并return null;就可以了。对比的是 Runnable,另一个明显的区别则是 Callable可以抛出异常。...注意 outcome 的注释,无论是否发生异常返回的都是这个 outcome,因为在执行中如果执行成功就将结果设置给了它(set()),而发生异常时将异常赋给了他(setException()),而在获取结果时也都返回了...这似乎就能回答开头的两个问题,并且浑然天成,就好像是一个问题,除非发生异常的时候返回的不是任务的结果而是异常对象。 总结一下继承关系: ?

    57610

    为什么 useState 返回的是 array 而不是 object?

    ,那么为什么是返回数组而不是返回对象呢?...为什么是返回数组而不是返回对象 要弄懂这个问题要先明白 ES6 的解构赋值,来看 2 个简单的例子: 数组的解构赋值 const foo = [1, 2, 3]; const [one, two, three...,那么使用者可以对数组中的元素命名,代码看起来也比较干净 如果 useState 返回的是对象,在解构对象的时候必须要和 useState 内部实现返回的对象同名,想要使用多次的话,必须得设置别名才能使用返回值...array 而不是 object 的原因就是为了降低使用的复杂度,返回数组的话可以直接根据顺序解构,而返回对象的话要想使用多次就得定义别名了 首发自:为什么 useState 返回的是 array...而不是 object?

    2.8K20
    领券