Hi Martin,

On 02/14/2018 10:58 AM, Peter Levart wrote:


I take back this claim. Of course the the following race is possible:

- Thread1: calls runAllFinalizers and takes a Finalizer from 'unprocessed' list. - Thread2: takee the same Finalizer instance from ReferenceQueue and calls runFinalizer() - Thread1: calls runFinalizer() with the same instance for the 2nd time now.

... but this could be "fixed" if the taking of next Finalizer from 'unfinalized' list and removing it from the same list was a single atomic operation. What do you say of the following further simplification:

http://cr.openjdk.java.net/~plevart/jdk-dev/8197812_Data_race_in_Finalizer/webrev.01/

Regards, Peter


Regards, Peter

On 02/14/2018 10:39 AM, Peter Levart wrote:
I could even claim that simplifying the if statement in remove() to:

    if (unfinalized == this) {
        unfinalized = this.next;
    }

makes checking for hasBeenFinalized() in runFinalizer() redundant as it would not be possible for runFinalizer() to be called more than once for each Finalizer instance because: - ReferenceQueue never returns the same Reference instance twice or more times. - 'unfinalized' will never point back to the same Finalizer instance for the 2nd time, because it always "travels" in the forward direction (unfinalized = unfinalized.next).

Regards, Peter

(I rest now).

Reply via email to