Hi Remi,

That was the initial implementation.  However, it was being invoked
during startup before Lambda was initialized and resulted in an ExceptionInInitializer.

We don't have a good handle on when it is too early to use lambda except by trial and error. I think there are some improvements in the works so that some simple cases of Lambda
can be used earlier and will see if they apply.

Thanks, Roger



On 10/13/2015 4:11 AM, Remi Forax wrote:
Hi Roger,

I agree with comments from Mark and Mandy,
you can also simplify your code by using a lambda instead of a class to 
implement the thread factory.

public static Cleaner create() {
   return create(runnable ->  {
       return AccessController.doPrivileged((PrivilegedAction<Thread>) () -> {
         Thread t = new InnocuousThread(runnable);
         t.setName("Cleaner-" + t.getId());
         return t;
       });
   });
}

given that the lambda (the one that takes a Runnable) doesn't capture anything,
it will be considered as a constant by the VM, so no need to implement the 
singleton pattern, here.

cheers,
Rémi

----- Mail original -----
De: "Mandy Chung" <mandy.ch...@oracle.com>
À: "mark reinhold" <mark.reinh...@oracle.com>
Cc: core-libs-dev@openjdk.java.net
Envoyé: Mardi 13 Octobre 2015 03:12:26
Objet: Re: RFR 9: 8138696 : java.lang.ref.Cleaner - an easy to use      
alternative to finalization


On Oct 12, 2015, at 12:30 PM, mark.reinh...@oracle.com wrote:

2015/10/8 1:41 -0700, roger.ri...@oracle.com:
Webrev:
http://cr.openjdk.java.net/~rriggs/webrev-cleaner-extensible-8138696/

javadoc:
    http://cr.openjdk.java.net/~rriggs/cleaner-doc2/
Roger -- thanks for taking this on.  The more we can do to get people
to stop using sun.misc APIs, the better.

A couple of comments/questions:

First, I think the approach in your first version is, well, cleaner.
+1

I started reviewing the first version and pondering on the benefits of the
new versions.


The additional abstract classes in the second version look like a
classic case of implementation inheritance that's not subtype
inheritance, what with the overrides of the original enqueue and
isEnqueued methods to throw UnsupportedOperationException.

I understand the desire to avoid allocating too many objects, but
do we have actual use cases where that's critical?  The original
sun.misc.Cleaner has been used by both internal and external code
to do relatively heavy-weight things like unmap direct buffers and
release other kinds of native resources, which suggests that
allocating three small objects per cleaner is not a problem.

Second, the original sun.misc.Cleaner only handles phantom references.
What are the use cases for weak and soft cleaners?

Finally, how important is it to be able to unregister a cleaner?  In
all the years we've had sun.misc.Cleaner that capability has never
been needed, and leaving it out would simplify the API.
If there is no strong need of unregister a cleaner, Cleaner API won’t need to
return a Cleanable object which I think it’s nice and simpler.

Mandy



Reply via email to