您的位置:首页 > Web前端

java.lang.ref.Reference

2013-01-12 15:10 246 查看
Java代码 

 


Reference提供了一些引用的基本方法以及静态代码块最高优先级启动ReferenceHandler线程  

[java] view
plaincopy

Reference提供了一些引用的基本方法以及静态代码块最高优先级启动ReferenceHandler线程  

Java代码 

 


package xxx;
  

    

/**  

 * Abstract base class for reference objects.  This class defines the  

 * operations common to all reference objects. Because reference objects are  

 * implemented in close cooperation with the garbage collector, this class may  

 * not be subclassed directly.  

 * 引用对象的抽象基类。这个类定义了所有引用对象的通用行为。  

 * 因为引用对象是通过与垃圾回收期密切合作来实现的,所以不能直接为此类创建子类.  

 *   

 *  

 * @version  1.43, 04/10/06  

 * @author   Mark Reinhold  

 * @since    1.2  

 */  

public abstract class Reference<T> {
  

    /* A Reference instance is in one of four possible internal states:  

     * 一种引用实例是可能是四种内部状态之一:  

     *    Active: Subject to special treatment by the garbage collector.  Some  

     *    time after the collector detects that the reachability of the  

     *    referent has changed to the appropriate state, it changes the  

     *    instance's state to either Pending or Inactive, depending upon  

     *    whether or not the instance was registered with a queue when it was  

     *    created.  In the former case it also adds the instance to the  

     *    pending-Reference list.  Newly-created instances are Active.  

     *    激活:垃圾回收器特别处理的主题。有时候在回收器检测到被引用(对象)的可达性被改变成适当  

     *    的状态,它会把实例的状态改变成等待状态或者未激活状态,这取决于实例是否被一个队列注册当  

     *    它被创建。在前一种情况下(等待状态),它也往等待-引用集合增加实例。  

     *  

     *  

     *    Pending: An element of the pending-Reference list, waiting to be  

     *    enqueued by the Reference-handler thread.  Unregistered instances  

     *    are never in this state.  

     *    等待:一个等待-引用集合里的元素,等待被引用处理线程放入队列中。  

     *    未注册的实例永远不会在这个状态  

     *  

     *    Enqueued: An element of the queue with which the instance was  

     *    registered when it was created.  When an instance is removed from  

     *    its ReferenceQueue, it is made Inactive.  Unregistered instances are  

     *    never in this state.  

     *    入队:实例被创建的时候被登记注册成一个队列的元素。当一个实例从引用队列中删除,它变成非激活状态。  

     *    未注册的实例永远不会在这个状态。        

     *  

     *    Inactive: Nothing more to do.  Once an instance becomes Inactive its  

     *    state will never change again.  

     *    非激活:不会再做什么。一旦一个实例成为非激活的,它的状态永远不会被改变。  

     *      

     *  

     * The state is encoded in the queue and next fields as follows:  

     * 状态在队列里被处理并且每个状态所表现的属性如下:  

     *   

     *  

     *    Active: queue = ReferenceQueue with which instance is registered, or  

     *    ReferenceQueue.NULL if it was not registered with a queue; next =  

     *    null.  

     *    激活:queue=引用队列时候,实例被它注册,  

     *    或者实例不被注册,当queue=ReferenceQueue.NULL时候;  

     *    next=null.  

     *  

     *    Pending: queue = ReferenceQueue with which instance is registered;  

     *    next = Following instance in queue, or this if at end of list.  

     *    等待:queue=引用队列时候,实例被它注册,  

     *    next=剩下的queue队列里面的实例,或者=this,如果this是队列的最后一个。  

     *  

     *    Enqueued: queue = ReferenceQueue.ENQUEUED; next = Following instance  

     *    in queue, or this if at end of list.  

     *    入队:queue=ReferenceQueue.ENQUEUED   

     *    next=剩下的queue队列里面的实例,或者=this,如果this是队列的最后一个  

     *      

     *      

     *    Inactive: queue = ReferenceQueue.NULL; next = this.  

     *    终止:队列=ReferenceQueue.NULL next=this  

     *  

     * With this scheme the collector need only examine the next field in order  

     * to determine whether a Reference instance requires special treatment: If  

     * the next field is null then the instance is active; if it is non-null,  

     * then the collector should treat the instance normally.  

     *   

     *   

     *   

     * To ensure that concurrent collector can discover active Reference   

     * objects without interfering with application threads that may apply   

     * the enqueue() method to those objects, collectors should link   

     * discovered objects through the discovered field.  

     */  

    private T referent;  /* Treated specially by GC */ //被GC引用的对象   

    ReferenceQueue<? super T> queue;//引用队列   

    Reference next;//下个引用   

    transient private Reference<T> discovered;  /* used by VM *///被VM引用的瞬态对象
  

  

    /* Object used to synchronize with the garbage collector.  The collector  

     * must acquire this lock at the beginning of each collection cycle.  It is  

     * therefore critical that any code holding this lock complete as quickly  

     * as possible, allocate no new objects, and avoid calling user code.  

     * GC线程在回收的时候的锁  

     * 对象被用来和GC同步。GC必须获得锁在每个回收的生命周期。  

     * 更关键的是任何持有锁的代码尽可能快的执行完,没有分配新的对象,并避免使用使用者的代码。  

     *   

     */  

    static private class Lock { };
  

    private static Lock lock = new Lock();
  

  

    /* List of References waiting to be enqueued.  The collector adds  

     * References to this list, while the Reference-handler thread removes  

     * them.  This list is protected by the above lock object.  

     * 排队的引用集合。当处理引用的线程删除引用时候,收集器添加引用到这个集合。  

     * 这个集合受上面的对象锁保护。  

     */  

    private static Reference pending = null;
  

    /* High-priority thread to enqueue pending References  

     * 处理排队等待的引用的高优先的线程  

     */  

    private static class ReferenceHandler extends Thread {
  

        ReferenceHandler(ThreadGroup g, String name) {   

            super(g, name);
  

            }   

        public void run() {
  

            for (;;) {
  

                /*  

                 * 给pending赋值  

                 * 如果pending.next=pending,pending=null;否则pending=pengding.next,最后把pending.next=pending  

                 * 下次执行线程里的代码时候pending=null了,再下次执行同步代码块就线程阻塞了  

                 *   

                 * 如果pending属性为空,释放锁的对象监视器,阻塞当前线程  

                 * */ 
  

                Reference r;   

                synchronized (lock) {
  

                    if (pending != null) {
  

                        r = pending;   

                        Reference rn = r.next;   

                        pending = (rn == r) ? null : rn;
  

                        r.next = r;   

                    } else {
  

                        try {
  

                            lock.wait();   

                        } catch (InterruptedException x) { }
  

                        continue;
  

                    }   

                }   

                // Fast path for cleaners    

                if (r instanceof Cleaner) {
  

                    ((Cleaner)r).clean();   

                    continue;
  

                }   

                /*  

                 *  ReferenceQueue.NULL的实现:   

                 *  private static class Null extends ReferenceQueue {  

                 * boolean enqueue(Reference r) {  

                 * return false;  

            }  

        }  

                 * 如果Q不为空,把引用放入Queue  

                 * 在刚创建一个引用,第二个参数没放Queue时候,为空。  

                 * */  

                ReferenceQueue q = r.queue;   

                if (q != ReferenceQueue.NULL) q.enqueue(r);
  

            }   

        }   

    }   

        static {
  

            //取得当前线程组   

            ThreadGroup tg = Thread.currentThread().getThreadGroup();   

            //取得最上层的System线程组   

            for (ThreadGroup tgn = tg;
  

            tgn != null;
  

            tg = tgn, tgn = tg.getParent());   

            //创建线程对象   

            Thread handler = new ReferenceHandler(tg, "Reference Handler");
  

            /* If there were a special system-only priority greater than  

             * MAX_PRIORITY, it would be used here  

             */  

            handler.setPriority(Thread.MAX_PRIORITY);//设置最高优先级   

            handler.setDaemon(true);//标记守护线程或用户线程   

            handler.start();//守护线程启动   

        }   

  

        /* -- Referent accessor and setters -- */  

        /**  

         * Returns this reference object's referent.  If this reference object has  

         * been cleared, either by the program or by the garbage collector, then  

         * this method returns <code>null</code>.  

         *  

         * @return  The object to which this reference refers, or  

         *   <code>null</code> if this reference object has been cleared  

         * 获得引用对象  

         */  

        public T get() {
  

            return this.referent;
  

        }   

        /**  

         * Clears this reference object.  Invoking this method will not cause this  

         * object to be enqueued.  

         *  

         * <p> This method is invoked only by Java code; when the garbage collector  

         * clears references it does so directly, without invoking this method.  

         * 清除引用对象  

         */  

        public void clear() {
  

            this.referent = null;
  

        }   

  

        /* -- Queue operations -- */  

        /**  

         * Tells whether or not this reference object has been enqueued, either by  

         * the program or by the garbage collector.  If this reference object was  

         * not registered with a queue when it was created, then this method will  

         * always return <code>false</code>.  

         *  

         * @return  <code>true</code> if and only if this reference object has  

         *   been enqueued  

         */  

        public boolean isEnqueued() {
  

            /* In terms of the internal states, this predicate actually tests  

            whether the instance is either Pending or Enqueued   

            是否处于等待状态  

            判断条件:队列不为空,  

            它的next属性不为空。  

            刚初始化一个Reference时候,next属性肯定是空的,因此肯定不处于等待状态  

             */  

            synchronized (this) {
  

                return (this.queue != ReferenceQueue.NULL) && (this.next != null);
  

                }   

            }   

        /**  

         * Adds this reference object to the queue with which it is registered,  

         * if any.  

         *  

         * <p> This method is invoked only by Java code; when the garbage collector  

         * enqueues references it does so directly, without invoking this method.  

         *  

         * @return  <code>true</code> if this reference object was successfully  

         *   enqueued; <code>false</code> if it was already enqueued or if  

        *   it was not registered with a queue when it was created  

        * 加入等待队列  

            */  

        public boolean enqueue() {
  

            return this.queue.enqueue(this);
  

        }   

  

        /* -- Constructors -- */  

        Reference(T referent) {   

            this(referent, null);
  

        }   

        Reference(T referent, ReferenceQueue<? super T> queue) {
  

            this.referent = referent;
  

            this.queue = (queue == null) ? ReferenceQueue.NULL : queue;
  

        }   

    }  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐