Sitelet https://github.com/javaevolved/javaevolved.github.io/issues/173
Skip to content

[Pattern] Finalizers to deterministic resource cleanup #173

Description

@brunoborges

Category

io

Slug

finalizers-to-resource-cleanup

Title

Finalizers to deterministic resource cleanup

Difficulty

advanced

Since JDK

9

Summary

Replace finalization with AutoCloseable and Cleaner as a defensive fallback.

Old code label

Finalization

Old code

@Override
protected void finalize() throws Throwable {
    nativeHandle.release();
}

Modern code label

AutoCloseable and Cleaner

Modern code

final class NativeResource implements AutoCloseable {
    private static final Cleaner CLEANER = Cleaner.create();
    private final Cleaner.Cleanable cleanable;

    NativeResource(State state) {
        cleanable = CLEANER.register(this, state);
    }

    @Override
    public void close() {
        cleanable.clean();
    }
}

Explanation

Finalization is deprecated for removal and offers unpredictable latency and weak safety guarantees. AutoCloseable enables deterministic cleanup through try-with-resources; Cleaner can provide a carefully designed last-resort fallback.

Why the modern way wins

⏱ Deterministic — Resources are released at a known point.
🛡 Safer lifecycle — Avoids finalizer resurrection and ordering hazards.
🧹 Defensive fallback — Cleaner can recover leaked resources without overriding finalize().

Metadata

Metadata

Assignees

No one assigned

    Labels

    slugNew or updated pattern snippet (category/slug.json)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions