当缓存中没有要找的数据时,则要从数据库中去查询,而当并发量比较大时可能会击穿数据库,所以guava cache对同一值的查询做了合并请求的处理。其中就用到了SettableFuture,类似一把锁,只会让一个请求线程去查询数据库而其他查询请求线程(查询同一个值)会处于等待状态。

下面是google guava 18.0中SettableFuture的UML关系图:

从图中我们可以看到SettableFuture实现了Future接口,说明可以异步的获取结果。它主要的实现继承于AbstractFuture,而SettableFuture只是做了一层封装。下面主要分析AbstractFuture。

AbstractFuture包含两个属性:一个是内部类Sync对象,一个是ExecutionList对象。

1.ExecutionList

ExecutionList从字面意思理解就是包含一系列execution的list,看ExecutionList的类图可知,它有一个内部类RunnableExecutorPair表示单向列表list中的一个节点,该节点由Runnable,Executor和next节点构成,当ExecutionList执行execution的时候,先判断executed是否已经执行过,如果没有为了按照顺序执行任务首先会反转单向链表,然后才是executor.execute(runnable)。

2.Sync

Sync也是继承AQS,实现对线程并发的控制。Sync包含5种状态(运行中:0,完成中:1,已完成:2,已取消:4,已中断:8),存储的值和异常。AbstractFuture类似一把共享锁,某一个时刻只能有一个线程能够拥有AQS的state进行写操作,而读的时候则可以让多个线程同时读。Sync中的set, setException和cancel操作都是写操作。SettableFuture中调用set的过程是这样的:当有一个线程调用set操作或setException时,其他写线程只能进入同步队列中进行等待,而其他读线程会根据Sync当前的状态返回对应的结果。而且AQS的state初始值是0,不管是set,setException和cancel操作后,state的值都不会为再为0,而是各个操作后的状态值。如果同时有多个线程访问,只有一个线程的操作会被接受,其他线程只有等待拥有锁的线程完成该操作,并获取那个操作的结果。

guava中的SettableFuture分析的更多相关文章

  1. Guava中Lists.partition(List, size) 方法懒划分/懒分区

    目录 Guava中Lists.partition(List, size) 方法懒划分/懒分区 背景 分析 总结 Guava中Lists.partition(List, size) 方法懒划分/懒分区 ...

  2. Guava中Predicate的常见用法

    Guava中Predicate的常见用法 1.  Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...

  3. Java经典类库-Guava中的函数式编程讲解

    如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...

  4. Android中AppWidget的分析与应用:AppWidgetProvider .

    from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...

  5. guava中eventbus注解使用

    guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈 ...

  6. JAVA WEB 中的编码分析

    JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...

  7. Android 中图片压缩分析(上)

    作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情 ...

  8. 《构建之法》教学笔记——Python中的效能分析与几个问题

    <构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...

  9. Apollo配置中心源码分析

    Apollo配置中心源码分析 1. apollo的核心代码分享 SpringApplication启动的关键步骤 在SpringApplication中,会加载所有实现了Init方法的类 protec ...

随机推荐

  1. Java学习的第四十六天

    1.例8.1例类 import java.util.Scanner; public class Cjava { public static void main(String[]args) { Time ...

  2. oracle truncate table recover(oracle 如何拯救误操作truncate的表)

     生产上肯定是容易脑袋发热,truncate一张表,立马的心跳加速,眼神也不迷糊了,搞错了,完了-- 那么,truncate表后,能不能进行恢复? truncate操作是比较危险的操作,不记录redo ...

  3. Linux 网络编程的5种IO模型:多路复用(select/poll/epoll)

    Linux 网络编程的5种IO模型:多路复用(select/poll/epoll) 背景 我们在上一讲 Linux 网络编程的5种IO模型:阻塞IO与非阻塞IO中,对于其中的 阻塞/非阻塞IO 进行了 ...

  4. Python list函数

  5. Java Spring Cloud服务间调用

    A服务是用户服务,B服务某个需求需要用户信息,而B服务无法连接用户的数据库(分库),需要让A服务查询用户信息. 在B服务写一个接口去调用A服务的某个请求 /** * 访问A服务 */ @FeignCl ...

  6. DCL单例模式中的缺陷及单例模式的其他实现

    DCL:Double Check Lock ,意为双重检查锁.在单例模式中懒汉式中可以使用DCL来保证程序执行的效率. 1 public class SingletonDemo { 2 private ...

  7. Newton插值的C++实现

    Newton(牛顿)插值法具有递推性,这决定其性能要好于Lagrange(拉格朗日)插值法.其重点在于差商(Divided Difference)表的求解. 步骤1. 求解差商表,这里采用非递归法(看 ...

  8. python爬虫05正则表达式

    字符 描述 \ 将下一个字符标记为一个特殊字符(File Format Escape,清单见本表).或一个原义字符(Identity Escape,有^$()*+?.[\{|共计12个).或一个向后引 ...

  9. C语言I博课作业04

    这个作业属于哪个课程 C语言程序设计II 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/SE2020-1/homework/11489 我在这个作业课程 ...

  10. python super继承用法

    子类对父类的继承一般写法为1, 高级方法为super. 1 # 1,普通继承 2 #新建一个父类 3 class Father(): 4 def father(self,message): 5 pri ...