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