首页 > 编程知识 正文

hashmap是线程安全的吗,hashmap做缓存

时间:2023-05-03 17:32:13 阅读:63020 作者:345

1 .在1. WeakHashMap应用场景中,由于大部分缓存占用内存,因此考虑到内存的有限性,无法缓存所有对象。 在这种情况下,必须使用其他集合,如WeakHashMap。 通过在存储某些对象的同时销毁其他对象,可以降低存储成本。

什么是WeakHashMap WeakHashMap? 除了HashMap之外,Weak也增加了。 这是一个表明这是弱引用的HashMap。

让我们来看看WeakHashMap的类定义。

公共类WeakHashMap,V extends AbstractMapK,V implements MapK,V {其WeakHashMap和HashMap有什么区别?

3. WeakHashMap和HashMap的区别在比较WeakHashMap和HashMap的区别之前,让我们先谈谈弱引用

关于弱引用Java有4种引用、强引用(Strong )、弱引用(Weak )、软引用(soft )、虚引用(phantom )。

弱引用表示不需要的对象,其强度低于软参考,必须通过WeakReference类间接引用目标对象。 与弱引用相关联的对象只能生存,直到发生下一个垃圾回收。 当触发垃圾回收时,无论当前内存是否足够,都只会回收与弱引用关联的对象

注:如果此对象仍在强引用中引用,则不会回收

在简单理解弱引用后,我们做一个

总结:

与HashMap的强键不同,WeakHashMap是弱键。

弱键的作用是随时都有可能被垃圾回收器回收。

4. WeakHashMap的实现原理主要通过WeakReference和ReferenceQueue实现

让我们看看源代码:

/* * theentriesinthishashtableextendweakreference,usingitsmainref * fieldasthekey.*/privatestaticcclassentryk,vextentrer 进入,下一步;/* * createsnewentry.*/entry (对象密钥,V value,参考队列对象队列,int hash,EntryK,V next ) super ) keeates this.hash=hash; this.next=next; }@suppresswarnings(unchecked ) (public K getKey ) (return ) weakHashmap.unmasknull ) get ) ); } public V getValue () { return value; }publicvsetvalue(vnewvalue ) { V oldValue=value; 值=new value; 返回载荷值; }创建新的WeakHashMap,将Entry添加到WeakHashMap中,然后使用数组表保存Entry。 假设弱密钥没有被强引用引用,则下一次GC将回收该弱密钥并将其添加到参考队列(queue )队列中。 再次使用WeakHashMap时,表和队列将首先同步。 表保存所有条目,队列保存GC回收的条目; 同步是删除table中GC回收的密钥-值对。/* * * expungesstaleentriesfromthetable.*/privatevoidexpungestaleentries () {for(Objectx; (x=queue.poll )!=null; (已同步(队列) suppresswarnings ) (已取消) ) EntryK,ve=) EntryK,v ) x; intI=indexfor(e.hash,table.length ); EntryK,V prev=table[i]; EntryK,V p=prev; while(p!=null}{entryk,V next=p.next; if(p==e ) if ) prev==e ) table[i]=next; else prev.next=next; //Must not null out e.next; //staleentriesmaybeinusebyahashiteratore.value=null; //Help GC size--; 布雷克; } prev=p; p=next; } } }大多数weak hashmap操作都调用名为expungeStaleEntries ()的方法,gc回收的目标queue接收gc发送的回收消息,并在queue的密钥中输入

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。