guava中的SettableFuture分析
当缓存中没有要找的数据时,则要从数据库中去查询,而当并发量比较大时可能会击穿数据库,所以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分析的更多相关文章
- Guava中Lists.partition(List, size) 方法懒划分/懒分区
目录 Guava中Lists.partition(List, size) 方法懒划分/懒分区 背景 分析 总结 Guava中Lists.partition(List, size) 方法懒划分/懒分区 ...
- Guava中Predicate的常见用法
Guava中Predicate的常见用法 1. Predicate基本用法 guava提供了许多利用Functions和Predicates来操作Collections的工具,一般在 Iterabl ...
- Java经典类库-Guava中的函数式编程讲解
如果我要新建一个java的项目,那么有两个类库是必备的,一个是junit,另一个是Guava.选择junit,因为我喜欢TDD,喜欢自动化测试.而是用Guava,是因为我喜欢简洁的API.Guava提 ...
- Android中AppWidget的分析与应用:AppWidgetProvider .
from: http://blog.csdn.net/thl789/article/details/7887968 本文从开发AppWidgetProvider角度出发,看一个AppWidgetPrv ...
- guava中eventbus注解使用
guava是 google 几个java核心类库的集合,包括集合.缓存.原生类型.并发.常用注解.基本字符串操作和I/O等等.学会使用该库相关api的使用,能使我们代码更简洁,更优雅,本章节我们来谈谈 ...
- JAVA WEB 中的编码分析
JAVA WEB 中的编码分析 */--> pre.src {background-color: #292b2e; color: #b2b2b2;} pre.src {background-co ...
- Android 中图片压缩分析(上)
作者: shawnzhao,QQ音乐技术团队一员 一.前言 在 Android 中进行图片压缩是非常常见的开发场景,主要的压缩方法有两种:其一是质量压缩,其二是下采样压缩. 前者是在不改变图片尺寸的情 ...
- 《构建之法》教学笔记——Python中的效能分析与几个问题
<构建之法:现代软件工程>中第2章对效能分析进行了介绍,基于的工具是VSTS.由于我教授的学生中只有部分同学选修了C#,若采用书中例子讲解,学生可能理解起来比较困难.不过所有这些学生都学习 ...
- Apollo配置中心源码分析
Apollo配置中心源码分析 1. apollo的核心代码分享 SpringApplication启动的关键步骤 在SpringApplication中,会加载所有实现了Init方法的类 protec ...
随机推荐
- 模拟量采集模块433Mhz LoRa无线自组网络介绍
模拟量采集模块433Mhz LoRa无线自组网络是LPWAN(低功耗广域网Low Power Wide Area Nerwork)通信技术中的一种,是美国Semtech公司采用和推广的一种基于扩频技术 ...
- Linux exec族函数解析
背景 在提到 vfork 函数时,我们提到了这个概念.为了更好地学习与运用,我们对exec族函数进行展开. exec函数族 介绍 有时我们希望子进程去执行另外的程序,exec函数族就提供了一个在进程中 ...
- mns: Money Never Sleeps! 自己开发的一款 IDEA 插件介绍.
一边敲代码, 一边关注股票/基金行情, 还不怕同事盯到自己的屏幕! 对于一个关注股市跟基金的研发人员来说, 莫过于一天到晚写代码, 而不能及时的查看股市行情跟基金走势了吧. 写代码的时候比较容易忘记看 ...
- linux添加自动清空缓存
1. cleanCache.sh vim cleanCache.sh #!/bin/bash #每两小时清除一次缓存 echo "开始清除缓存" sync;sync;sync #写 ...
- Spark编程练习题
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("Spark SQL b ...
- EFCore自己用的点东西
测试一下EF core 的操作 蛀牙总是用导航属性有的时候有点不理解 写个例子给自己用 class Program { static void Main(string[] args) { MyDbCo ...
- 内网渗透 day6-msf后门植(windows)
后门植入 目录 1. 持续化后门 2. 手动上传木马并加入注册表中 3. 上传nc 4. 开3389-->shift后门-->远程登入 5. at调用 1. 持续化后门 在提权后的mete ...
- 手机运行Linux系统,可以办公,可以上网,太爽了!
之前用 Termux 编程一直都是在黑乎乎的命令行敲代码,有多少人知道其实可以在手机上用 Termux 构建一个包含桌面环境的 Linux 系统呢. 这个构建出的 linux 系统,可以显示出桌面,可 ...
- 类和对象在JVM中是如何存储的,竟然有一半人回答不上来!
前言 这篇博客主要来说说类与对象在JVM中是如何存储的,由于JVM是个非常庞大的课题,所以我会把他分成很多章节来细细阐述,具体的数量还没有决定,当然这不重要,重点在于是否可以在文章中学到东西,是否对J ...
- mysql中key和index的关系
原文链接:https://blog.csdn.net/top_code/article/details/50599840