Class FinalizableReferenceQueue
- java.lang.Object
-
- com.google.common.base.FinalizableReferenceQueue
-
- All Implemented Interfaces:
Closeable
,AutoCloseable
@GwtIncompatible public class FinalizableReferenceQueue extends Object implements Closeable
A reference queue with an associated background thread that dequeues references and invokesFinalizableReference.finalizeReferent()
on them.Keep a strong reference to this object until all of the associated referents have been finalized. If this object is garbage collected earlier, the backing thread will not invoke
finalizeReferent()
on the remaining references.As an example of how this is used, imagine you have a class
MyServer
that creates a aServerSocket
, and you would like to ensure that theServerSocket
is closed even if theMyServer
object is garbage-collected without calling itsclose
method. You could use a finalizer to accomplish this, but that has a number of well-known problems. Here is how you might use this class instead:public class MyServer implements Closeable { private static final FinalizableReferenceQueue frq = new FinalizableReferenceQueue(); // You might also share this between several objects. private static final Set<Reference<?>> references = Sets.newConcurrentHashSet(); // This ensures that the FinalizablePhantomReference itself is not garbage-collected. private final ServerSocket serverSocket; private MyServer(...) { ... this.serverSocket = new ServerSocket(...); ... } public static MyServer create(...) { MyServer myServer = new MyServer(...); final ServerSocket serverSocket = myServer.serverSocket; Reference<?> reference = new FinalizablePhantomReference<MyServer>(myServer, frq) { public void finalizeReferent() { references.remove(this): if (!serverSocket.isClosed()) { ...log a message about how nobody called close()... try { serverSocket.close(); } catch (IOException e) { ... } } } }; references.add(reference); return myServer; } public void close() { serverSocket.close(); } }
- Since:
- 2.0
- Author:
- Bob Lee
-
-
Constructor Summary
Constructors Constructor Description FinalizableReferenceQueue()
Constructs a new queue.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description void
close()
Closes this stream and releases any system resources associated with it.
-
-
-
Constructor Detail
-
FinalizableReferenceQueue
public FinalizableReferenceQueue()
Constructs a new queue.
-
-
Method Detail
-
close
public void close()
Description copied from interface:java.io.Closeable
Closes this stream and releases any system resources associated with it. If the stream is already closed then invoking this method has no effect.As noted in
AutoCloseable.close()
, cases where the close may fail require careful attention. It is strongly advised to relinquish the underlying resources and to internally mark theCloseable
as closed, prior to throwing theIOException
.- Specified by:
close
in interfaceAutoCloseable
- Specified by:
close
in interfaceCloseable
-
-