blob: ae733a018f2a1398c3cbb4b3c8d249b8c685686c (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
|
# HG changeset patch
# User chegar
# Date 1356010827 0
# Node ID 3c7eb39c811464c98847a4f1a167636c1db80f17
# Parent a0e51ed355c9ae1256f8d344df34babb87a1edce
8003335: Better handling of Finalizer thread
Reviewed-by: alanb, ahgross
diff --git a/src/share/classes/java/lang/ref/Finalizer.java b/src/share/classes/java/lang/ref/Finalizer.java
--- jdk/src/share/classes/java/lang/ref/Finalizer.java
+++ jdk/src/share/classes/java/lang/ref/Finalizer.java
@@ -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();
|