首页 > 编程知识 正文

strong是什么意思(atomicreference使用场景)

时间:2023-05-03 09:16:28 阅读:64630 作者:2377

长期以来,WeakReference和SoftReference一直添加到Java API中,但并不是所有的Java程序员都熟悉它。 这意味着在Java中使用WeakReference和SoftReference的位置和方法存在差异。 参考班对垃圾收集机制特别重要。 众所周知,垃圾收集器会从有资格进行垃圾回收的对象中回收内存,但很少程序员知道该资格取决于对该对象的引用类型。 这也是Java中WeakReference和SoftReference的主要区别。 如果只有弱引用指向该对象并热心收集,则垃圾收集器可以收集该对象; 另一方面,如果JVM绝对需要内存,则会收集具有SoftReference的对象。 由于SoftReference和WeakReference的这些特殊行为在SoftReference实现缓存方面看起来很完美,因此当JVM需要内存时,它们会删除仅由SoftReference指向的对象另一方面,WeakReference非常适合存储元数据,如类加载器引用。 如果没有加载类,则不需要保留对ClassLoader的引用。 WeakReference在删除最后一个强引用后立即授予ClassLoader垃圾回收资格。 本文详细介绍了Java的各种引用,包括强引用和重影引用。

对于不认识的人,Java有四个参考:

强引用最简单的是软引用重影引用不足以强引用。 为什么这么说,是因为我们在日常编程中使用它。 例如,代码中String s=“ abc”,而引用变量s对String对象“abc”有很强的引用。 带有“强引用”的对象不符合垃圾回收条件。 很明显,这些是Java程序所需的对象。 弱引用由java.lang.ref.WeakReference类表示,可以使用以下代码创建弱引用:

Counter counter=new Counter (; //strong reference-line1weakreferencecounterweakcounter=newweakreferencecounter (counter ); //weak参考计数器=null; //nowcounterobjectiseligibleforgarbagecollection现在,通过将强引用计数器设置为null,可以垃圾回收在行1中创建的计数器对象。 无法防止Counter对象的垃圾回收,因为没有更多引用变量“weakCounter”引用的“强引用”和“弱引用”。 另一方面,如果这是“软引用”,则在JVM绝对需要内存之前,不会回收Counter对象。 Java的软引用使用java.lang.ref.SoftReference类表示。 可以使用以下代码在Java中创建SoftReference :

Counter prime=new Counter (; //primeholdsastrongreference-line2softreferencecountersoft=newsoftreferencecounter (prime ); //softreferencevariablehassoftreferencetocounterobjectcreatedatline2prime=null; //nowcounterobjectiseligibleforgarbagecollectionbutonlybecollectedwhenjvmabsolutelyneedsmemory清空强引用后, 第二行中创建的counter对象只有一个软引用,由于SoftReference和WeakReference之间的主要区别,SoftReference适合缓存,WeakReference适合存储元数据WeakHashMap是WeakReference的一个有用示例。 这是Map接口(如HashMap和TreeMap )的另一个实现,但它有自己的功能。 WeakHashMap将关键帧包装为WeakReference。 也就是说,如果删除对实际对象的强引用,WeakHashMap内部的WeakReference不会阻止垃圾回收。

镜像引用是java.lang.ref包中提供的第三种引用类型。 幻影引用由java.lang.ref.PhantomReference类表示。 如果喜欢垃圾收集器,则只能收集幻影引用指向它们的对象。 与WeakReference和SoftReference一样,可以使用以下代码创建PhantomReference :

digitalcounterdigit=newdigitalcounter (; //digitreferencevariablehasstrongreference-line3phantomreferencedigitalcounterphantom=newphantomreferencedigitalcounter 删除“强引用”后,在第三行创建的DigitalCounter对象可以随时执行垃圾回收。 这无法阻止GC操作,因为只有一个phantom参考。

除了WeakReference、SoftReference、PhantomReference和WeakHashMap外,还有一个名为ReferenceQueue的类。 可以在创建WeakReference、SoftReference或PhantomReference时提供参考队列实例,如以下代码所示:

referencequeuerefqueue=newreferencequeue (; //referencewillbestoredinthisqueueforcleanupdigitalcounterdigit=newdigitalcounter (; phantomreferencedigitalcounterphantom=newphantomreferencedigitalcounter (digit,refQueue ); 对实例的引用将添加到参考队列中,并且可以通过轮询参考队列来执行任何清理。 此图充分总结了对象的生命周期。

这就是Java中WeakReference和SoftReference的区别。 我们还学习了引用类的基础,包括Java、WeakHashMap和ReferenceQueue的弱引用、软引用和幻像引用。 仔细使用引用可以简化垃圾回收,并改进Java中的内存管理。

3:https://www.Java code geeks.com/2014/03/difference-between-weak reference-vs-soft reference-vs-phantomremerence

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