001: /*
002: * @(#)SoftReference.java 1.34 06/10/10
003: *
004: * Copyright 1990-2006 Sun Microsystems, Inc. All Rights Reserved.
005: * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER
006: *
007: * This program is free software; you can redistribute it and/or
008: * modify it under the terms of the GNU General Public License version
009: * 2 only, as published by the Free Software Foundation.
010: *
011: * This program is distributed in the hope that it will be useful, but
012: * WITHOUT ANY WARRANTY; without even the implied warranty of
013: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014: * General Public License version 2 for more details (a copy is
015: * included at /legal/license.txt).
016: *
017: * You should have received a copy of the GNU General Public License
018: * version 2 along with this work; if not, write to the Free Software
019: * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
020: * 02110-1301 USA
021: *
022: * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa
023: * Clara, CA 95054 or visit www.sun.com if you need additional
024: * information or have any questions.
025: *
026: */
027:
028: package java.lang.ref;
029:
030: /**
031: * Soft reference objects, which are cleared at the discretion of the garbage
032: * collector in response to memory demand. Soft references are most often used
033: * to implement memory-sensitive caches.
034: *
035: * <p> Suppose that the garbage collector determines at a certain point in time
036: * that an object is <a href="package-summary.html#reachability">softly
037: * reachable</a>. At that time it may choose to clear atomically all soft
038: * references to that object and all soft references to any other
039: * softly-reachable objects from which that object is reachable through a chain
040: * of strong references. At the same time or at some later time it will
041: * enqueue those newly-cleared soft references that are registered with
042: * reference queues.
043: *
044: * <p> All soft references to softly-reachable objects are guaranteed to have
045: * been cleared before the virtual machine throws an
046: * <code>OutOfMemoryError</code>. Otherwise no constraints are placed upon the
047: * time at which a soft reference will be cleared or the order in which a set
048: * of such references to different objects will be cleared. Virtual machine
049: * implementations are, however, encouraged to bias against clearing
050: * recently-created or recently-used soft references.
051: *
052: * <p> Direct instances of this class may be used to implement simple caches;
053: * this class or derived subclasses may also be used in larger data structures
054: * to implement more sophisticated caches. As long as the referent of a soft
055: * reference is strongly reachable, that is, is actually in use, the soft
056: * reference will not be cleared. Thus a sophisticated cache can, for example,
057: * prevent its most recently used entries from being discarded by keeping
058: * strong referents to those entries, leaving the remaining entries to be
059: * discarded at the discretion of the garbage collector.
060: *
061: * @version 1.27, 02/02/00
062: * @author Mark Reinhold
063: * @since 1.2
064: */
065:
066: public class SoftReference extends Reference {
067:
068: /* Timestamp clock, updated by the garbage collector
069: */
070: static private long clock;
071:
072: /* Timestamp updated by each invocation of the get method. The VM may use
073: * this field when selecting soft references to be cleared, but it is not
074: * required to do so.
075: */
076: private long timestamp;
077:
078: /**
079: * Creates a new soft reference that refers to the given object. The new
080: * reference is not registered with any queue.
081: *
082: * @param referent object the new soft reference will refer to
083: */
084: public SoftReference(Object referent) {
085: super (referent);
086: this .timestamp = clock;
087: }
088:
089: /**
090: * Creates a new soft reference that refers to the given object and is
091: * registered with the given queue.
092: *
093: * @param referent object the new soft reference will refer to
094: * @param q queue the soft reference is registered with
095: * @throws NullPointerException If the <code>queue</code> argument
096: * is <code>null</code>
097: *
098: */
099: public SoftReference(Object referent, ReferenceQueue q) {
100: super (referent, q);
101: this .timestamp = clock;
102: }
103:
104: /**
105: * Returns this reference object's referent. If this reference object has
106: * been cleared, either by the program or by the garbage collector, then
107: * this method returns <code>null</code>.
108: *
109: * @return The object to which this reference refers, or
110: * <code>null</code> if this reference object has been cleared
111: */
112: public Object get() {
113: Object o = super.get();
114: if (o != null)
115: this.timestamp = clock;
116: return o;
117: }
118:
119: }
|