WeakReference弱引用

示例代碼如下:

import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;

/**
 * @author chenjc
 * @since 2020-01-13
 */
public class WeakReferenceTest {

    public static void main(String[] args) throws InterruptedException {
        User user = new User(1, "debo");
        ReferenceQueue<User> userReferenceQueue = new ReferenceQueue<>();
        // 建立User對象的弱引用
        UserWeakReference userWeakReference = new UserWeakReference(user, userReferenceQueue);
        // 去掉強引用
        user = null;
        System.out.println(userWeakReference.get());
        // 手動觸發GC
        System.gc();
        System.out.println("GC: " + userWeakReference.get());
        Reference<? extends User> reference = userReferenceQueue.remove(1000);
        if (reference != null) {
            UserWeakReference userWeakReference1 = (UserWeakReference) reference;
            System.out.println("GC隊列: " + userWeakReference1.getId());
        }
    }

    private static class User {
        private Integer id;
        private String name;

        public User(Integer id, String name) {
            this.id = id;
            this.name = name;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        @Override
        public String toString() {
            return "User{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    '}';
        }
    }

    private static class UserWeakReference extends WeakReference<User> {

        private Integer id;

        public UserWeakReference(User referent, ReferenceQueue<? super User> q) {
            super(referent, q);
            this.id = referent.id;
        }

        public Integer getId() {
            return id;
        }

        public void setId(Integer id) {
            this.id = id;
        }
    }
}

輸出如下:

User{id=1, name='debo'}
GC: null
GC隊列: 1

可見,一旦發生GC,弱引用的對象都會被回收。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章