guava cache 存储的数据结构2之ReferenceEntry实现类 --- 3
2016-01-28 11:27
931 查看
上一节提到缓存中的实体类是ReferenceEntry{K, V>(key可以是任意的类型,value是ValueReference{K, V>),但是它只是个接口,下图是他的实现
创建方式
这个是在Segment类里,map 是LocalCache.
AbstractReferenceEntry :所有的方法都是抛出异常
WeakEntry : 除了hash,next,valueReference 其余方法都是抛出异常
这个实现WeakReference,采用了弱引用,再没有引用时即会被垃圾回收
创建方式
这个是在Segment类里,map 是LocalCache.
ReferenceEntry<K, V> newEntry(K key, int hash, @Nullable ReferenceEntry<K, V> next) { return map.entryFactory.newEntry(this, checkNotNull(key), hash, next); }
而entryFactory = EntryFactory.getFactory(keyStrength, usesAccessEntries(), usesWriteEntries()); 1. keyStrength : 默认是Strength.STRONG,还有SOFT和WEAK
enum EntryFactory { STRONG -- new StrongEntry<K, V>(key, hash, next), ..... static final EntryFactory[] factories = { STRONG, STRONG_ACCESS, STRONG_WRITE, STRONG_ACCESS_WRITE, WEAK, WEAK_ACCESS, WEAK_WRITE, WEAK_ACCESS_WRITE, }; //提供具体的实体类 static EntryFactory getFactory(Strength keyStrength, boolean usesAccessQueue, boolean usesWriteQueue) { int flags = ((keyStrength == Strength.WEAK) ? 4: 0) | (usesAccessQueue ? 1: 0) | (usesWriteQueue ? 2: 0); return factories[flags]; }
AbstractReferenceEntry :所有的方法都是抛出异常
public ValueReference<K, V> getValueReference() { throw new UnsupportedOperationException(); } public void setValueReference(ValueReference<K, V> valueReference) { throw new UnsupportedOperationException(); } ...//都是抛出异常,所以这个类没有实际意义
1. StrongEntry : 提供key,value,hash,nxt
final K key; final int hash; final ReferenceEntry<K, V> next;//就是每次插入的 volatile ValueReference<K, V> valueReference = unset();
1.1 StrongAccessEntry : 访问的实体类,访问时间,前一个和后一个访问的节点
volatile long accessTime = Long.MAX_VALUE ReferenceEntry<K, V> nextAccess = nullEntry(); ReferenceEntry<K, V> previousAccess = nullEntry();
1.2 StrongWriteEntry :写入的实体类,写入时间,前一个和后一个写入的节点
volatile long writeTime = Long.MAX_VALUE; ReferenceEntry<K, V> nextWrite = nullEntry(); ReferenceEntry<K, V> previousWrite = nullEntry();
1.3 StrongAccessWriteEntry : 以上的 1.1和1.2 的所有属性都有
WeakEntry : 除了hash,next,valueReference 其余方法都是抛出异常
这个实现WeakReference,采用了弱引用,再没有引用时即会被垃圾回收
class WeakEntry<K, V> extends WeakReference<K> implements ReferenceEntry<K, V> { final int hash; final ReferenceEntry<K, V> next; volatile ValueReference<K, V> valueReference = unset(); public void setPreviousInWriteQueue(ReferenceEntry<K, V> previous) { throw new UnsupportedOperationException(); } ..... }
其余几个方法和Strong的相对应
相关文章推荐
- 【数据结构学习笔记】——排序
- 零碎的数据结构与算法——Dijkstra双栈算数表达式求解
- hdu 1255(线段树+离散化)
- 数据结构:JavaScript实现列表
- Coursera课程《Python数据结构》中课件
- Coursera课程《Python数据结构》中课程目录
- guava cache 存储的数据结构 --- 2
- POJ1363 Rails(数据结构栈)
- 数据结构和算法是程序的根本——为什么?!
- 数据结构(寒假小结)——2.3线性表之双链表和循环链表
- 跟我学数据结构之线性表
- 【Redis笔记(五)】 Redis数据结构 - set集合
- 数据结构--二叉树
- 链表的理解与实现[数据结构]
- python 数据结构
- 数据结构实现之有序符号表BST二叉查找树
- 数据结构(寒假小结)——2.2线性表之单链表
- python数据结构
- 小蚂蚁学习数据结构(25)——图的基本概念和术语
- 数据结构---队列的实现