RFR: jsr166 jdk9 integration wave 13

Paul Sandoz paul.sandoz at oracle.com
Fri Dec 16 20:59:18 UTC 2016


> On 16 Dec 2016, at 11:58, Martin Buchholz <martinrb at google.com> wrote:
> 
> Thanks, Stefan!
> 
> The creation of these bridge classes seem like a misfeature/bug of javac.

It’s to work around the current access control rules enforced by the VM. The Java source world and the bytecode/VM world have different opinions.

IIUC we need a clearer notion of "nest mate" classes (something that Valhalla is looking into).

Paul.

> We should avoid them where possible.  Every unnecessary class file makes
> every single java program a little slower to start up.  We can discover
> such "bridge classes" heuristically by looking for "small" synthetic class
> files:
> 
> find build/classes/java.base/ -name '*$[0-9].class' -size -800c
> 
> I think adding the package-private constructor is slightly better software
> engineering than making the classes themselves package-private:
> 
> Index: PriorityQueue.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/PriorityQueue.java,v
> retrieving revision 1.115
> diff -u -r1.115 PriorityQueue.java
> --- PriorityQueue.java 2 Dec 2016 07:11:36 -0000 1.115
> +++ PriorityQueue.java 16 Dec 2016 19:54:22 -0000
> @@ -522,6 +522,8 @@
>          */
>         private int expectedModCount = modCount;
> 
> +        Itr() {}
> +
>         public boolean hasNext() {
>             return cursor < size ||
>                 (forgetMeNot != null && !forgetMeNot.isEmpty());
> Index: concurrent/ConcurrentLinkedDeque.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/ConcurrentLinkedDeque.java,v
> retrieving revision 1.79
> diff -u -r1.79 ConcurrentLinkedDeque.java
> --- concurrent/ConcurrentLinkedDeque.java 8 Dec 2016 05:03:37 -0000 1.79
> +++ concurrent/ConcurrentLinkedDeque.java 16 Dec 2016 19:54:23 -0000
> @@ -1367,12 +1367,14 @@
> 
>     /** Forward iterator */
>     private class Itr extends AbstractItr {
> +        Itr() {}
>         Node<E> startNode() { return first(); }
>         Node<E> nextNode(Node<E> p) { return succ(p); }
>     }
> 
>     /** Descending iterator */
>     private class DescendingItr extends AbstractItr {
> +        DescendingItr() {}
>         Node<E> startNode() { return last(); }
>         Node<E> nextNode(Node<E> p) { return pred(p); }
>     }
> Index: concurrent/CyclicBarrier.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/CyclicBarrier.java,v
> retrieving revision 1.57
> diff -u -r1.57 CyclicBarrier.java
> --- concurrent/CyclicBarrier.java 8 Oct 2016 20:37:20 -0000 1.57
> +++ concurrent/CyclicBarrier.java 16 Dec 2016 19:54:23 -0000
> @@ -120,6 +120,7 @@
>      * but no subsequent reset.
>      */
>     private static class Generation {
> +        Generation() {}
>         boolean broken;         // initially false
>     }
> 
> Index: concurrent/LinkedBlockingDeque.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/LinkedBlockingDeque.java,v
> retrieving revision 1.67
> diff -u -r1.67 LinkedBlockingDeque.java
> --- concurrent/LinkedBlockingDeque.java 13 Dec 2016 18:55:57 -0000 1.67
> +++ concurrent/LinkedBlockingDeque.java 16 Dec 2016 19:54:23 -0000
> @@ -1145,12 +1145,14 @@
> 
>     /** Forward iterator */
>     private class Itr extends AbstractItr {
> +        Itr() {}
>         Node<E> firstNode() { return first; }
>         Node<E> nextNode(Node<E> n) { return n.next; }
>     }
> 
>     /** Descending iterator */
>     private class DescendingItr extends AbstractItr {
> +        DescendingItr() {}
>         Node<E> firstNode() { return last; }
>         Node<E> nextNode(Node<E> n) { return n.prev; }
>     }
> Index: concurrent/SubmissionPublisher.java
> ===================================================================
> RCS file:
> /export/home/jsr166/jsr166/jsr166/src/main/java/util/concurrent/SubmissionPublisher.java,v
> retrieving revision 1.67
> diff -u -r1.67 SubmissionPublisher.java
> --- concurrent/SubmissionPublisher.java 16 Dec 2016 13:11:50 -0000 1.67
> +++ concurrent/SubmissionPublisher.java 16 Dec 2016 19:54:23 -0000
> @@ -165,7 +165,8 @@
>         ForkJoinPool.commonPool() : new ThreadPerTaskExecutor();
> 
>     /** Fallback if ForkJoinPool.commonPool() cannot support parallelism */
> -    static final class ThreadPerTaskExecutor implements Executor {
> +    private static final class ThreadPerTaskExecutor implements Executor {
> +        ThreadPerTaskExecutor() {}
>         public void execute(Runnable r) { new Thread(r).start(); }
>     }
> 
> 
> 
> On Fri, Dec 16, 2016 at 5:14 AM, Doug Lea <dl at cs.oswego.edu> wrote:
> 
>> On 12/15/2016 01:17 PM, Stefan Zobel wrote:
>> 
>> I recently noticed that javac creates a synthetic class and a bridge
>>> constructor
>>> for SubmissionPublisher.ThreadPerTaskExecutor because its generated
>>> constructor
>>> is private. I don't know if it really matters but that could be avoided by
>>> declaring a package-private constructor that does nothing.
>>> 
>> 
>> Or, more simply remove the unnecessary "private" qualifier for the
>> nested ThreadPerTaskExecutor class, as we did in the similar usage in
>> CompletableFuture, and should have remembered to do here.
>> Done; thanks.
>> 
>> -Doug
>> 
>> 
>> 
>> 
>> 
>>>   /** Fallback if ForkJoinPool.commonPool() cannot support parallelism */
>>>>   private static final class ThreadPerTaskExecutor implements Executor {
>>>>       // avoid creation of synthetic class and bridge constructor
>>>>       ThreadPerTaskExecutor() {}
>>>>       public void execute(Runnable r) { new Thread(r).start(); }
>>>>   }
>>>> 
>>> 
>>> 
>>> Regards,
>>> Stefan
>>> 
>>> 
>> 



More information about the core-libs-dev mailing list