在JAVA编程思想第四章有这么一段代码:
class Chair {
static boolean gcrun = false;
static boolean f = false;
static int created = 0;
static int finalized = 0;
int i;
Chair() {
i = ++created;
//%%%%%%System.out.println(created);
if(created == 47)
System.out.println("Created 47");
}
protected void finalize() {
if(!gcrun) {
gcrun = true;
System.out.println(
"Beginning to finalize after " +
created + " Chairs have been created");
}
if(i == 47) {
System.out.println(
"Finalizing Chair #47, " +
"Setting flag to stop Chair creation");
f = true;
}
finalized++;
if(finalized >= created)
System.out.println(
"All " + finalized + " finalized");
}
}
public class Garbage {
public static void main(String[] args) {
if(args.length == 0) {
System.err.println("Usage: \n" +
"java Garbage before\n or:\n" +
"java Garbage after");
return;
}
while(!Chair.f) {
new Chair();
new String("To take up space");
}
System.out.println(
"After all Chairs have been created:\n" +
"total created = " + Chair.created +
", total finalized = " + Chair.finalized);
if(args[0].equals("before")) {
System.out.println("gc():");
System.gc();
System.out.println("runFinalization():");
System.runFinalization();
}
System.out.println("bye!");
if(args[0].equals("after"))
System.runFinalizersOnExit(true);
}
}
正常情况下输出为:
Created 47
Beginning to finalize after 3957 Chairs have been created
Finalizing Chair #47, Setting flag to stop Chair creation
All 32882 finalized
After all Chairs have been created:
total created = 32883, total finalized = 32882
gc():
All 32883 finalized
runFinalization():
bye!
但是我在打%的地方增加一行代码后(去掉注释),出现如下结果:
...
61781
61782
61783
61784
61785
Finalizing Chair #47, Setting flag to stop Chair creation
All 61785 finalized
61786
After all Chairs have been created:
total created = 61786, total finalized = 61785
gc():
All 61786 finalized
runFinalization():
bye!
请问这是怎么回事?