关于PhantomReference研究的一个问题

package com.sunhang;

//: containers/References.java
// Demonstrates Reference objects
import java.lang.ref.*;
import java.util.*;

class VeryBig {
    private static final int SIZE = 10000;
    private long[] la = new long[SIZE];
    private String ident;
    public VeryBig(String id) { ident = id; }
    public String toString() { return ident; }
    protected void finalize() {
        System.out.println("Finalizing " + ident);
    }
}

public class References {
    private static ReferenceQueue<VeryBig> rq =
            new ReferenceQueue<VeryBig>();
    public static void checkQueue() {
//        Reference<? extends VeryBig> inq = rq.poll();
//        if(inq != null)
//            System.out.println("In queue: " + inq.get());
    }
    public static void main(String[] args) throws InterruptedException {
        int size = 10;
        // Or, choose size via the command line:
        if(args.length > 0)
            size = new Integer(args[0]);
        LinkedList<SoftReference<VeryBig>> sa =
                new LinkedList<SoftReference<VeryBig>>();
        for(int i = 0; i < size; i++) {
            sa.add(new SoftReference<VeryBig>(
                    new VeryBig("Soft " + i), rq));
            System.out.println("Just created: " + sa.getLast());
            checkQueue();
        }
        LinkedList<WeakReference<VeryBig>> wa =
                new LinkedList<WeakReference<VeryBig>>();
        for(int i = 0; i < size; i++) {
            wa.add(new WeakReference<VeryBig>(
                    new VeryBig("Weak " + i), rq));
            System.out.println("Just created: " + wa.getLast());
            checkQueue();
        }
        SoftReference<VeryBig> s =
                new SoftReference<VeryBig>(new VeryBig("Soft"));
        WeakReference<VeryBig> w =
                new WeakReference<VeryBig>(new VeryBig("Weak"));

        System.gc();

        LinkedList<PhantomReference<VeryBig>> pa =
                new LinkedList<PhantomReference<VeryBig>>();
        for(int i = 0; i < size; i++) {
            pa.add(new PhantomReference<VeryBig>(
                    new VeryBig("Phantom " + i), rq));
            System.out.println("Just created: " + pa.getLast());
            checkQueue();
        }

        new Thread(){
            @Override
            public void run() {
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }

                Reference<? extends VeryBig> inq = null;
                int count = 0;
//                while((inq = rq.poll()) != null){
//                    count ++;
//                    System.out.println("inq:" + inq.get() + " count:" + count + " " + inq.getClass().getSimpleName());
//                }

                synchronized (Reference.class){
                    try {
                        Reference.class.wait(2000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }

                System.out.println("again");

                count = 0;
                while((inq = rq.poll()) != null){
                    count ++;
                    System.out.println("inq:" + inq.get() + " count:" + count + " " + inq.getClass().getSimpleName());
                }

            }
        }.start();

        Thread.sleep(3000);
        System.gc();

        Thread.sleep(15000);
    }
} /* (Execute to see output) *///:~

这段代码我认为会把PhantomReference加入到ReferenceQueue中,但是结果中表示并没有加入到队列中。这是为什么呢?有机会研究一下?结果如下:

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Finalizing Weak

Finalizing Weak 9

Finalizing Weak 8

Finalizing Weak 7

Finalizing Weak 6

Finalizing Weak 5

Finalizing Weak 4

Finalizing Weak 3

Finalizing Weak 2

Finalizing Weak 1

Finalizing Weak 0

Just created: [email protected]

Just created: [email protected]220b15

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Just created: [email protected]

Finalizing Phantom 4

Finalizing Phantom 5

Finalizing Phantom 7

Finalizing Phantom 6

Finalizing Phantom 0

Finalizing Phantom 1

Finalizing Phantom 2

Finalizing Phantom 3

Finalizing Phantom 9

Finalizing Phantom 8

again

inq:null count:1 WeakReference

inq:null count:2 WeakReference

inq:null count:3 WeakReference

inq:null count:4 WeakReference

inq:null count:5 WeakReference

inq:null count:6 WeakReference

inq:null count:7 WeakReference

inq:null count:8 WeakReference

inq:null count:9 WeakReference

inq:null count:10 WeakReference

时间: 2024-12-16 10:12:28

关于PhantomReference研究的一个问题的相关文章

Delphi的MDI编程中遇到的一个奇怪问题(值得研究的一个问题)

近日在用delphi写一个多文档应用程序,除了一个主界面是自动生成的,其他功能页面全部都是通过Application.CreateForm()动态生成的,也就是说在ProjectManager中点击程序名右键,最后一个选项,打开选项页,在Auto-Create Forms下只有主窗体.主窗体和功能页窗体的FormStyle属性均为fsMDIChild,其余属性均为默认.我在设计时曾经改过主窗体的一些属性,发现不行后又改了回来,可是一旦程序调用了Application.CreateForm()创建

五花八门的信用与业务相关程度研究是一个思路

信用,从某种程度上有点像悬在每个人头上一把虚拟的剑,其本身并没有锋芒,而一旦它和实际商务活动.生活联系起来,将成为可以制约所有人的利器. 一方面,信用的数据来源很多.交通罚单.水电费交费记录.信用卡还款证明,甚至大学时候的一次考试作弊,都会成为信用数据来源的依据,都可以成为衡量一个人信用好坏的论据之一.而所谓的信用系统,就是要将这些来自各方面的五花八门的数据,按照一定的规则,变成信用系统中可衡量的数字,从而影响一个人的信用. 目前的障碍:银行各自为政的,信息孤岛, 每家银行可能都有自己的征信评估

手机短信轰炸机源码研究

研究了一个下午的手机短信轰炸机,还是有不错的收获的. 实现原理就是利用各大网站注册时,需要手机短信接收验证码,当用户可以批量从不同网站申请注册接收验证码的时候, 就有了手机短信轰炸机的效果,技术实现不难,比较难的就是把各个网站的获取注册验证码的get链接提取出来出来. 假如用php写的话,就是用javascript点击控制,通过不同加载img 里面src 来发送get请求. 由于移动对垃圾短信也进行了很多方面的技术防范,最终实现的效果是每一分钟才收到1-5条短信. 最后把全部短信轰炸机打开同时对

HDU 1241 BFS入门。。做了一个晚上,自己总算入门了。

下面上题目. Oil Deposits Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13340    Accepted Submission(s): 7671 Problem Description The GeoSurvComp geologic survey company is responsible for detectin

Sketch - Missing Fonts 页面样式混乱研究

今天我们设计问我,能不能实现一个页面多种字体? 我满口答应绝对没问题啊小事一桩 font-family 分分钟搞定 ?? 结果打开 Sketch 就傻眼了. 心头一紧,有种不详的预感,颤颤巍巍的戳下 Missing Fonts 更可怕的是,页面完全变了形,重启 Sketch 也没用 查找诸多,发现是原因如下: - 设计师安装了字体库,而我没安装,字体缺失时 Sketch 选择用默认字体展示 - 默认字体比设计师使用的字体要宽大(字体也是以瘦为美,这个看颜的社会啊)于是超出了原来占位空间 - Sk

深度学习在图像识别中的研究进展与展望

深度学习在图像识别中的研究进展与展望 深度学习是近十年来人工智能领域取得的最重要的突破之一.它在语音识别.自然语言处理.计算机视觉.图像与视频分析.多媒体等诸多领域都取得了巨大成功.本文将重点介绍深度学习在物体识别.物体检测.视频分析的最新研究进展,并探讨其发展趋势. 1.深度学习发展历史的回顾 现在的深度学习模型属于神经网络.神经网络的历史可以追溯到上世纪四十年代,曾经在八九十年代流行.神经网络试图通过大脑认知的机理,解决各种机器学习的问题.1986年Rumelhart.Hinton和Will

一些对数学领域及数学研究的个人看法(转载自博士论坛wcboy)

转自:http://www.math.org.cn/forum.php?mod=viewthread&tid=14819&extra=&page=1 原作者: wcboy 现在的论坛质量比以前差了,大部分都是来解题问答的,而且层次较低.以前论坛中,Qullien很令人印象深刻,但愿他能在国外闯出一片天空.现在 基础数学版代数&数论子版中那几个讨论代数几何的还不错.不期望目前论坛出现很多高层次高手,高层次高手应该站在好课题上高观点讨论数学,出 现这样的网友,看他们的言论非常过

何为用户研究?

随着web2.0的兴起,使得产品设计越来越需要聚焦于人.做好对人的研究将有助于设计出好的产品.这篇文章是我在工作中的一些总结,分为以下三部分. 一.用户研究的方法 1.用户研究的目的      用户研究可帮助企业了解用户.定义自己的目标用户群分布情况:明确目标用户需求,并使其为产品设计提供客观依据与导向:使得通过研究后设计的产品能更好的让用户使用,在提高用户体验的同时,加强用户对产品的粘性与满意度. 2.用户研究的流程/方法 (1)前期用户调查(通过调研或访谈确定目标用户范围,并给出目标用户特征

一个Navi过程下多个DocumentCompleted事件问题的解决办法

7.16 Marked to Write.... 七月份马克的一篇文章了,今天才想起来把他写完,呵呵. 原本是七月份用来做微博爬虫的,后来发现新浪对机器人的检测不好绕过,连简单地访问都会被检测出来,后来还封掉了一个小号...我也没干啥呀. 这新浪,纯HTML访问不让也就算了,连OAuth2.0里很多接口都不能用了,这样子爬数据的难度可就大大加大了. 废话不多说---------------------------------------------------------------------