46 lines
1.0 KiB
Plaintext
46 lines
1.0 KiB
Plaintext
Running finalizers on JVM exit is disabled by default. It can be enabled with ``++System.runFinalizersOnExit++`` and ``++Runtime.runFinalizersOnExit++``, but both methods are deprecated because they are are inherently unsafe.
|
|
|
|
|
|
According to the Oracle Javadoc:
|
|
|
|
____
|
|
It may result in finalizers being called on live objects while other threads are concurrently manipulating those objects, resulting in erratic behavior or deadlock.
|
|
|
|
____
|
|
|
|
If you really want to be execute something when the virtual machine begins its shutdown sequence, you should attach a shutdown hook.
|
|
|
|
|
|
== Noncompliant Code Example
|
|
|
|
----
|
|
public static void main(String [] args) {
|
|
...
|
|
System.runFinalizersOnExit(true); // Noncompliant
|
|
...
|
|
}
|
|
|
|
protected void finalize(){
|
|
doSomething();
|
|
}
|
|
----
|
|
|
|
|
|
== Compliant Solution
|
|
|
|
----
|
|
public static void main(String [] args) {
|
|
Runtime.addShutdownHook(new Runnable() {
|
|
public void run(){
|
|
doSomething();
|
|
}
|
|
});
|
|
//...
|
|
----
|
|
|
|
|
|
== See
|
|
|
|
* https://wiki.sei.cmu.edu/confluence/x/4jZGBQ[CERT, MET12-J.] - Do not use finalizers
|
|
|