美文网首页
WeakHashmap

WeakHashmap

作者: idle_39b5 | 来源:发表于2018-10-04 14:58 被阅读0次

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

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

    相关文章

      网友评论

          本文标题:WeakHashmap

          本文链接:https://www.haomeiwen.com/subject/khuxaftx.html