gpt4 book ai didi

java - 为什么 Java 有 4 种不同类型的引用?

转载 作者:行者123 更新时间:2023-12-04 01:07:03 24 4
gpt4 key购买 nike

直到今天,我才意识到 Java 有四种主要类型的引用。

  • 强引用:默认引用类型为 Java使用。
  • 弱引用:如果对象具有弱引用,则 GC即使有足够的内存,也会在下次运行时回收该对象的内存。
  • 软引用:如果对象有软引用,则 GC只有当它非常需要一些内存时才回收这个对象的内存。
  • 幻像引用:如果一个对象有一个幻像引用,那么它就有资格进行垃圾回收。但是,在 GC 之前,JVM 将应该被垃圾回收的对象放入名为 reference queue 的队列中。 .

  • 我理解了基本概念,并编写了一个小程序来了解每种引用类型的工作原理。
    import java.lang.ref.PhantomReference;
    import java.lang.ref.ReferenceQueue;
    import java.lang.ref.SoftReference;
    import java.lang.ref.WeakReference;

    class User
    {
    public User info()
    {
    System.out.println("Info method invoked from User class");
    return null;
    }
    }

    public class ReferencesExample
    {
    public static void main(String[] args)
    {
    //Strong Reference
    User userRefObj = new User();
    System.out.println("1 :" + userRefObj.info());

    // Weak Reference
    WeakReference<User> weakref = new WeakReference<User>(userRefObj.info());
    System.out.println("2 : " + weakref);

    // Soft Reference
    SoftReference<User> softref = new SoftReference<User>(userRefObj.info());
    System.out.println("3 : " + softref);

    // Phantom Reference
    ReferenceQueue<User> refQueueObj = new ReferenceQueue<User>();
    PhantomReference<User> phantomRef = new PhantomReference<User>(userRefObj.info(),refQueueObj);
    System.out.println("4 : " + phantomRef);

    }
    }
    输出 :
    1 :null
    Info method invoked from User class
    Info method invoked from User class
    2 : java.lang.ref.WeakReference@15db9742
    Info method invoked from User class
    3 : java.lang.ref.SoftReference@6d06d69c
    Info method invoked from User class
    4 : java.lang.ref.PhantomReference@7852e922
    疑问 :我们如何决定在现实世界场景中使用哪种引用类型以及在何处使用?

    最佳答案

    事实的答案非常简单:因为仅靠强引用是不够的。在现实世界的生产代码中,您肯定需要一些弱引用的概念。
    然后可以争辩说其他类型只是过度工程化。该语言的设计者认为这些是有帮助的,但除了非常模糊的情况外,它们并非如此。但注意:对应的语义无法用普通的java代码来完成。所以这是其中一种情况“让我们将它添加到语言中,以防我们需要它”。
    但是第二段很容易被视为意见,而不是事实。

    关于java - 为什么 Java 有 4 种不同类型的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66086544/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com