David, this needs editing. * The cleaning function is invoked after the object it is cleaning up after it * becomes phantom reachable, so it is important that the references and values * it needs do not prevent the object from becoming phantom reachable.
1) The "after it" looks like a leftover from an edit 2) "becomes phantom reachable" after already "becoming phantom reachable" needs clarification to make sense: My suggestion: * The cleaning function is invoked after the object it is cleaning becomes * phantom reachable, so it is important that the object's references and values * do not prevent the object from remaining phantom reachable. PS: I noticed in the source that much of the documentation is written with line breaks but without the <p> tag. If you have a paragraph in mind, perhaps you can remove the line breaks so it doesn't look like <p> tags were meant to be there but forgotten. Cheers, Paul On Tue, Dec 15, 2015 at 1:01 AM, David Holmes <david.hol...@oracle.com> wrote: > PS. > > create(): can also throw SecurityException if not allowed to create/start > threads. > > David > > On 10/12/2015 4:40 AM, Roger Riggs wrote: > >> Hi, >> >> The example is revised to caution about inner classes and lambdas. >> >> [1]http://cr.openjdk.java.net/~rriggs/webrev-cleaner-8138696/ >> [2]http://cr.openjdk.java.net/~rriggs/cleaner-doc/index.html >> >> Thanks, Roger >> >> On 12/9/2015 11:04 AM, Peter Levart wrote: >> >>> Hi Chris, >>> >>> On 12/09/2015 04:03 PM, Chris Hegarty wrote: >>> >>>> Peter, >>>> >>>> On 09/12/15 07:05, Peter Levart wrote: >>>> >>>>> Hi, >>>>> >>>>> I think the only way to try to prevent such things is with a good >>>>> example in javadoc that "screams" of possible miss-usages. >>>>> >>>>> >>>>> public static class CleanerExample implements AutoCloseable { >>>>> >>>>> private static final Cleaner cleaner = ...; // preferably a >>>>> shared cleaner >>>>> >>>>> private final PrivateNativeResource pnr; >>>>> >>>>> private final Cleaner.Cleanable cleanable; >>>>> >>>>> public CleanerExample(args, ...) { >>>>> >>>>> // prepare captured state as local vars... >>>>> PrivateNativeResource _pnr = ...; >>>>> >>>>> this.cleanable = cleaner.register(this, () -> { >>>>> // DON'T capture any instance fields with lambda since >>>>> that would >>>>> // capture 'this' and prevent it from becoming >>>>> >>>> >>>> I assume that the WARNING should include anonymous inner classes too >>>> ( which I expect are quite common, though less now with lambda ) ? >>>> >>>> Is "leaking" 'this' in a constructor a potential issue with respect >>>> to the visibility of pnr? As well as causing red-squiggly lines in >>>> the IDE ;-) >>>> >>> >>> 'this' only leaks to the 'referent' field of PhantomReference where by >>> definition is not accessible. >>> >>> 'this' can become phantom-reachable before CleanerExample constructor >>> ends. But this is harmless, because the code that may execute at that >>> time does not access the object any more, so the object may be safely >>> collected. >>> >>> Cleanup action can run at any time after registration even before >>> CleanerExample constructor ends. But this is harmless too, because it >>> only accesses PrivateNativeResource which is fully constructed before >>> registration of cleanup action. >>> >>> I see no issues apart from IDE(s) not seeing no issues. >>> >>> Regards, Peter >>> >>> >>>> -Chris. >>>> >>>> >>>> phantom-reachable!!! >>>>> _pnr.close(); >>>>> }); >>>>> >>>>> this.pnr = _pnr; >>>>> } >>>>> >>>>> public void close() { >>>>> cleanable.clean(); >>>>> } >>>>> >>>>> >>>>> Regards, Peter >>>>> >>>>> >>> >>