RFR 9: 8138696 : java.lang.ref.Cleaner - an easy to use alternative to finalization
Peter Levart
peter.levart at gmail.com
Fri Dec 4 21:31:28 UTC 2015
On 12/04/2015 10:04 PM, Roger Riggs wrote:
> Hi Peter,
>
> On 12/04/2015 03:30 PM, Peter Levart wrote:
>> Just a nit more, Roger:
>>
>> 131 * <p>
>> 132 * The cleaner terminates when it is unreachable and all of the
>> 133 * registered cleaning functions are complete.
>>
>> (and also in the javadoc of the other create() method)
>>
>> The cleaner is an object. What terminates is a thread. So what about:
>>
>> "The thread terminates after the cleaner becomes unreachable and all
>> of the registered cleaning functions have completed."
>
> The cleaner is not just an object but is an active processing element.
> The thread is an artifact of the implementation and not exposed in the API
> any more than necessary (due to the thread factory).
>
> Colloquially, the combination of state and thread can be referred to
> as the cleaner;
> it starts, it processes cleanup functions for unreachable objects, and
> it stops when there are no more.
>
> It may be useful to talk about the thread terminating, but that is an
> implementation detail
> and not readily visible.
Ok, I buy that.
>
>>
>>
>> Would writing something like the following make sense: "A future
>> implementation may use more than one thread. The ThreadFactory should
>> not assume that only one thread will be requested." ?
> I'm not sure it adds anything to talk about how many times the thread
> factory will be used.
> A ThreadFactory has no specific mins or maxes.
>
> Roger
Yes, but other parts of javadoc strictly mention a thread (as singular
object).
Users are sloppy and like to depend on implementation details. They will
be tempted to write code like this:
Thread t = new Thread(...);
t.setName(...);
...
Cleaner c = Cleaner.create(() -> t);
...and it will work. But will fail if some time in the future, Cleaner
decides to request multiple threads. Are you sure Cleaner will always
use a single thread? It will if the spec. says so. But I don't think
there is a reason to specify that and limit the implementation to one
thread forever.
Regards,
Peter
>
>>
>> Regards, Peter
>>
>> On 12/04/2015 05:55 PM, Roger Riggs wrote:
>>> Hi,
>>>
>>> Thanks for the review and comments.
>>>
>>> The webrev[1] and javadoc[2] are updated in place.
>>>
>>> Roger
>>>
>>> [1] http://cr.openjdk.java.net/~rriggs/webrev-cleaner-8138696/
>>> [2] http://cr.openjdk.java.net/~rriggs/cleaner-doc/index.html
>>>
>>> On 12/3/2015 4:50 PM, mark.reinhold at oracle.com wrote:
>>>> Looks good -- thanks for the further simplification.
>>>>
>>>> Minor editorial comments, to add what Kim and Chris noted:
>>>>
>>>> - In many places you write, e.g., "Cleaner" rather than "{@code
>>>> Cleaner}". For consistency with the rest of the package it'd be
>>>> better in most cases just to write "cleaner" or, if its nature as
>>>> a class is important, write "{@code Cleaner}". The same goes for
>>>> Cleanable, Thread, ThreadFactory, and all other types.
>>>>
>>>> - The specification of Cleaner::create() mentions
>>>> "ThreadContextClassLoader", but that's not actually a type
>>>> anywhere
>>>> in the JDK. Suggest "{@linkplain
>>>> java.lang.Thread#getContextClassLoader context class loader}.
>>>>
>>>> - In the same method, it'd be helpful to provide links into the
>>>> Thread
>>>> class (or wherever) for the concepts of access-control context
>>>> and
>>>> thread locals.
>>>>
>>>> - Mark
>>>
>>
>
More information about the core-libs-dev
mailing list