RFR: jsr166 jdk9 integration wave 13

Martin Buchholz martinrb at google.com
Fri Dec 16 19:58:21 UTC 2016


Thanks, Stefan!

The creation of these bridge classes seem like a misfeature/bug of javac.
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