Download ReferenceDemo.java source file
/** Weak and soft reference demo. * * The first program reads data from a file. Since the data may be requested * again later, we save it using a soft reference. The GC may (or may not) * free the object if low on space, often removing the older objects first. * This means you can use soft references to make a "cache": save something * in RAM in case it is needed again later, but allow the GC to reclaim it * if running low on space. * * Weak references are useful for indexes to objects. If the objects are * otherwise freed, you don't want the index to force the JVM to keep the * object in RAM. If some object only has weak references to it the GC will * free it up (as if there were no references to it). This sort of index is * so common there is a WeakHashMap collection with weakly referenced keys; * An entry in a WeakHashMap will automatically be removed when its key is * no longer in ordinary use. (Presumably this will free the value as well.) * the second program shows a simple way to track which logged in users are * in some chat room. If the user logs out ordinarily you would need to add * code to find which room(s) that user was in and remove them from it (them). * This is a good use for weak references. // Written 2/2001 by Wayne Pollock, Tampa Florida USA. // (Adapted from "The Java Programming Language" 3rd Ed. by Ken Arnold et. al.) import java.lang.ref.*; import java.io.File; class DataCache { private File lastFile; // This should probably be soft too! private SoftReference lastData; byte[] readFromFile ( File file ) { byte [] data; // Check if we already have the right data saved in RAM: if ( file.equals( lastFile ) { data = (byte[]) lastData.get(); // Data may have been garbage collected, so check: if ( data != null ) return data; } // Don't have data, so read and save it in cache: data = readBytesFromFile( file ); lastFile = file; lastData = new SoftReference( data ); return data; } } /*********************************************************/ class Person { String name; UserID id; ... UserID getID () { return id; } } class ChatServer { List<UserID> loggedInusers = new ArrayList<UserID>(); ... void login () { ... Person p = new Person( ... ); loggedInUsers.add( p.getID() ); } ... void logout ( UserID id ) { ... loggedInUsers.remove( id ); // Deletes from chatrooms too! } } class ChatRoom { WeakHashMap<UserID, Person> users = new WeakHashMap<UserID, Person>(); ... public void userEntersRoom ( UserID id, Person user ) { users.add( id, user ); ... } public void listUsersInRoom () { for ( UserID id : users.keySet() ) System.out.println( users.get(id) ); } }