1 /*
2  * Copyright (c) 1998, 2016, Oracle and/or its affiliates. All rights reserved.
3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4  *
5  * This code is free software; you can redistribute it and/or modify it
6  * under the terms of the GNU General Public License version 2 only, as
7  * published by the Free Software Foundation.  Oracle designates this
8  * particular file as subject to the "Classpath" exception as provided
9  * by Oracle in the LICENSE file that accompanied this code.
10  *
11  * This code is distributed in the hope that it will be useful, but WITHOUT
12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14  * version 2 for more details (a copy is included in the LICENSE file that
15  * accompanied this code).
16  *
17  * You should have received a copy of the GNU General Public License version
18  * 2 along with this work; if not, write to the Free Software Foundation,
19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20  *
21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22  * or visit www.oracle.com if you need additional information or have any
23  * questions.
24  */
25 
26 /**
27  * Provides reference-object classes, which support a limited degree
28  * of interaction with the garbage collector.  A program may use a
29  * reference object to maintain a reference to some other object in
30  * such a way that the latter object may still be reclaimed by the
31  * collector.  A program may also arrange to be notified some time
32  * after the collector has determined that the reachability of a given
33  * object has changed.
34  *
35  *<h2>Package Specification</h2>
36  *
37  * A <em>reference object</em> encapsulates a reference to some other
38  * object so that the reference itself may be examined and manipulated
39  * like any other object.  Three types of reference objects are
40  * provided, each weaker than the last: <em>soft</em>, <em>weak</em>,
41  * and <em>phantom</em>.  Each type corresponds to a different level
42  * of reachability, as defined below.  Soft references are for
43  * implementing memory-sensitive caches, weak references are for
44  * implementing canonicalizing mappings that do not prevent their keys
45  * (or values) from being reclaimed, and phantom references are for
46  * scheduling post-mortem cleanup actions.
47  * Post-mortem cleanup actions can be registered and managed by a
48  * {@link java.lang.ref.Cleaner}.
49  *
50  * <p> Each reference-object type is implemented by a subclass of the
51  * abstract base {@link java.lang.ref.Reference} class.
52  * An instance of one of these subclasses encapsulates a single
53  * reference to a particular object, called the <em>referent</em>.
54  * Every reference object provides methods for getting and clearing
55  * the reference.  Aside from the clearing operation reference objects
56  * are otherwise immutable, so no {@code set} operation is
57  * provided.  A program may further subclass these subclasses, adding
58  * whatever fields and methods are required for its purposes, or it
59  * may use these subclasses without change.
60  *
61  * <h3>Notification</h3>
62  *
63  * A program may request to be notified of changes in an object's
64  * reachability by <em>registering</em> an appropriate reference
65  * object with a <em>reference queue</em> at the time the reference
66  * object is created.  Some time after the garbage collector
67  * determines that the reachability of the referent has changed to the
68  * value corresponding to the type of the reference, it will clear the
69  * reference and add it to the associated queue.  At this point, the
70  * reference is considered to be <em>enqueued</em>.  The program may remove
71  * references from a queue either by polling or by blocking until a
72  * reference becomes available.  Reference queues are implemented by
73  * the {@link java.lang.ref.ReferenceQueue} class.
74  *
75  * <p> The relationship between a registered reference object and its
76  * queue is one-sided.  That is, a queue does not keep track of the
77  * references that are registered with it.  If a registered reference
78  * becomes unreachable itself, then it will never be enqueued.  It is
79  * the responsibility of the program using reference objects to ensure
80  * that the objects remain reachable for as long as the program is
81  * interested in their referents.
82  *
83  * <p> While some programs will choose to dedicate a thread to
84  * removing reference objects from one or more queues and processing
85  * them, this is by no means necessary.  A tactic that often works
86  * well is to examine a reference queue in the course of performing
87  * some other fairly-frequent action.  For example, a hashtable that
88  * uses weak references to implement weak keys could poll its
89  * reference queue each time the table is accessed.  This is how the
90  * {@link java.util.WeakHashMap} class works.  Because
91  * the {@link java.lang.ref.ReferenceQueue#poll
92  * ReferenceQueue.poll} method simply checks an internal data
93  * structure, this check will add little overhead to the hashtable
94  * access methods.
95  *
96  * <a id="reachability"></a>
97  * <h3>Reachability</h3>
98  *
99  * Going from strongest to weakest, the different levels of
100  * reachability reflect the life cycle of an object.  They are
101  * operationally defined as follows:
102  *
103  * <ul>
104  *
105  * <li> An object is <em>strongly reachable</em> if it can be reached
106  * by some thread without traversing any reference objects.  A
107  * newly-created object is strongly reachable by the thread that
108  * created it.
109  *
110  * <li> An object is <em>softly reachable</em> if it is not strongly
111  * reachable but can be reached by traversing a soft reference.
112  *
113  * <li> An object is <em>weakly reachable</em> if it is neither
114  * strongly nor softly reachable but can be reached by traversing a
115  * weak reference.  When the weak references to a weakly-reachable
116  * object are cleared, the object becomes eligible for finalization.
117  *
118  * <li> An object is <em>phantom reachable</em> if it is neither
119  * strongly, softly, nor weakly reachable, it has been finalized, and
120  * some phantom reference refers to it.
121  *
122  * <li> Finally, an object is <em>unreachable</em>, and therefore
123  * eligible for reclamation, when it is not reachable in any of the
124  * above ways.
125  *
126  * </ul>
127  *
128  * @author        Mark Reinhold
129  * @since         1.2
130  */
131 package java.lang.ref;
132