rspec/rules/S2151/java/rule.adoc

42 lines
1.0 KiB
Plaintext
Raw Normal View History

2021-04-28 16:49:39 +02:00
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