Mercurial > hg > openjdk > jigsaw > jdk
changeset 7301:c876e9321616
8003335: Better handling of Finalizer thread
Reviewed-by: alanb, ahgross
author | chegar |
---|---|
date | Thu, 20 Dec 2012 13:40:27 +0000 |
parents | bae4a15265d3 |
children | 0c5c54303c92 |
files | src/share/classes/java/lang/ref/Finalizer.java |
diffstat | 1 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- a/src/share/classes/java/lang/ref/Finalizer.java Tue Feb 05 16:38:25 2013 -0800 +++ b/src/share/classes/java/lang/ref/Finalizer.java Thu Dec 20 13:40:27 2012 +0000 @@ -38,9 +38,9 @@ */ static native void invokeFinalizeMethod(Object o) throws Throwable; - static private ReferenceQueue queue = new ReferenceQueue(); - static private Finalizer unfinalized = null; - static private Object lock = new Object(); + private static ReferenceQueue queue = new ReferenceQueue(); + private static Finalizer unfinalized = null; + private static final Object lock = new Object(); private Finalizer next = null, @@ -142,7 +142,11 @@ /* Called by Runtime.runFinalization() */ static void runFinalization() { forkSecondaryFinalizer(new Runnable() { + private volatile boolean running; public void run() { + if (running) + return; + running = true; for (;;) { Finalizer f = (Finalizer)queue.poll(); if (f == null) break; @@ -155,7 +159,11 @@ /* Invoked by java.lang.Shutdown */ static void runAllFinalizers() { forkSecondaryFinalizer(new Runnable() { + private volatile boolean running; public void run() { + if (running) + return; + running = true; for (;;) { Finalizer f; synchronized (lock) { @@ -168,10 +176,14 @@ } private static class FinalizerThread extends Thread { + private volatile boolean running; FinalizerThread(ThreadGroup g) { super(g, "Finalizer"); } public void run() { + if (running) + return; + running = true; for (;;) { try { Finalizer f = (Finalizer)queue.remove();