Tibor17 commented on a change in pull request #78: COMPRESS-485 keep zip 
entries order in parallel zip creation
URL: https://github.com/apache/commons-compress/pull/78#discussion_r283110877
 
 

 ##########
 File path: 
src/main/java/org/apache/commons/compress/archivers/zip/ParallelScatterZipCreator.java
 ##########
 @@ -255,8 +257,13 @@ public void writeTo(final ZipArchiveOutputStream 
targetStream)
             compressionDoneAt = System.currentTimeMillis();
 
             synchronized (streams) {
+                // write zip entries in the order they were added (kept as 
futures)
+                for (final Future<ScatterZipOutputStream> future : futures) {
 
 Review comment:
   This loop was added. And it is a problem in this synchronized block.
   The monitor lock is `streams` and not `futures`. They cannot be both in one 
statement.
   Problem: this will cause NPE when the CPU is overloaded. The same issue was 
fixed in Surefire (see memory model).
   Additionally the `futures.add()` is not synchronized!
   One way would be for you to introduce double synchro block.
   I would not do it! Instead I would avoid synchronizations of `ArrayList` and 
on both. Then I would use modern collections which do not need external 
synchronizatrions (i.e. `Collections.synch...`)  and this way there would not 
be any `synchronized`. Use `ConcurrentLinkedDequeue`. It is useful when you add 
to the tail of the queue and do not remove, and if you iterate, because this 
implementation safely iterates even if you change it : no issue.  

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


With regards,
Apache Git Services

Reply via email to