WeakHashmap

2018-10-04  本文已影响0人  idle_39b5

近日阅读 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源码的应该没有什么问题,不多做解释了。

当然其中还有很多的奥妙及设计思想需更深入的学习

上一篇下一篇

猜你喜欢

热点阅读