@GwtIncompatible public class FinalizableReferenceQueue extends Object implements Closeable
FinalizableReference.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 a
ServerSocket
, and you would like to ensure that the ServerSocket
is closed even if the MyServer
object is garbage-collected without calling
its close
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();
}
}
Constructor and Description |
---|
FinalizableReferenceQueue()
Constructs a new queue.
|
Modifier and Type | Method and Description |
---|---|
void |
close()
Closes this stream and releases any system resources associated
with it.
|
public FinalizableReferenceQueue()
public void close()
java.io.Closeable
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 the Closeable
as closed, prior to throwing
the IOException
.
close
in interface Closeable
close
in interface AutoCloseable
Copyright © 2010–2020. All rights reserved.