近日阅读 hadoop 源码时,经常就遇到一个集合 WeakHashmap,阅读源码,发现jdk1.2就出现了这个集合,而且Doug Lea也参与了创作,因此可以花点时间了解一下。
一开始看到了Weak,就不由自主想起了Java中的引用类型WeakReference,即无论内存是否充足,GC会回收只被弱引用关联的对象
查看Entry的源码,可以验证确实采用了这种机制
Weakhashmap中核心的Entry内部类那么我们就可以做出一些猜测: 即Entry会被自行回收,那么就可能会发生例如如下的事
1.containsKey()返回的结果 两次不同
2. size() 两次返回不同的结果
.................
通过源码我们可以看到在增删改查的操作前都使用了expungeStaleEntries()方法,方法名说的很清楚,那么就大致验证了猜测,接下来我们就会有一些问题:
Why use it?
任何事物都有他存在的道理,WeakHashmap业务场景就是缓存,可以有效的节省内存,缓存丢失也不会出太大 问题,可以再次获取。许多开源框架,例如tomcat等都使用了weakHashmap做为缓存处理。
How it work?
直接看expungeStaleEntries()
首先queue是一个ReferenceQueue,可以简单理解为是用来存放weak Reference的队列,即weak Reference指向的对象除了该弱引用外没有别的强引用时,该对象就会被回收,进入ReferenceQueue.
循环对引用队列中的WeakReference进行遍历,把每个引用队列中的对象和当前map里面的进行比较,进行回收,剩下的代码熟悉hashmap源码的应该没有什么问题,不多做解释了。
当然其中还有很多的奥妙及设计思想需更深入的学习
网友评论