uniqueElements in parallel mode - encounter order

Georgiy Rakov georgiy.rakov at oracle.com
Mon Dec 3 02:42:22 PST 2012


We work with promoted build 64. To be more precise the build I use for 
developing was downloaded from:
http://jre.us.oracle.com/java/re/lambda/8/promoted/ea/b64/bundles/windows-amd64/lambda-8-b64-windows-amd64-05_nov_2012.zip

We would appreciate greatly if you could promote new build with all the 
fixes.

Thanks, Georgiy.

On 30.11.2012 18:54, Paul Sandoz wrote:
> What revision are you working from?
>
> I don't observe such behaviour from the tip, encounter order is preserved for both sequential and parallel streams.
>
> Example output:
>
>     [testng] [1, 1, 8, 0, 1, 3, 5, 6, 5, 3, 9, 1, 5, 9, 8, 6, 6, 4, 7, 4, 4, 2, 7, 6, 7, 5, 0, 4, 0, 9, 7, 4, 1, 2, 5, 4, 4, 4, 5, 4, 3, 5, 4, 1, 9, 2, 2, 4, 0, 3, 6, 8, 0, 3, 6, 3, 1, 3, 2, 8, 7, 8, 2, 6, 5, 8, 2, 4, 4, 4, 0, 8, 3, 0, 2, 5, 0, 3, 8, 0, 9, 6, 7, 5, 1, 6, 5, 1, 0, 0, 9, 7, 1, 9, 7, 4, 3, 8, 8, 9, 8, 7, 1, 1, 7, 6, 0, 2, 3, 8, 2, 9, 7, 6, 1, 1, 5, 4, 9, 8, 3, 8, 2, 5, 9, 3, 1, 5, 3, 8, 5, 5, 3, 1, 3, 4, 7, 5, 9, 8, 8, 7, 8, 1, 2, 3, 2, 1, 9, 7, 1, 0, 2, 3, 0, 5, 3, 1, 6, 7, 3, 6, 3, 7, 7, 4, 4, 2, 9, 5, 7, 9, 2, 6, 5, 5, 4, 0, 0, 9, 0, 0, 8, 3, 7, 2, 8, 0, 6, 9, 3, 9, 8, 3, 8, 0, 8, 8, 1, 6, 5, 2, 0, 5, 1, 8, 8, 7, 5, 3, 0, 9, 1, 0, 2, 6, 0, 4, 0, 6, 9, 9, 8, 4, 4, 4, 2, 8, 2, 2, 9, 9, 0, 6, 3, 4, 7, 9, 2, 4, 4, 2, 1, 6, 6, 2, 6, 5, 4, 2, 6, 7, 1, 5, 6, 6, 9, 2, 9, 9, 2, 9, 5, 1, 5, 7, 7, 9, 3, 6, 5, 3, 4, 7, 7, 2, 6, 7, 1, 6, 1, 1, 3, 8, 0, 6, 4, 2, 0, 9, 0, 7, 1, 6, 7, 0, 5, 3, 8, 7]
>     [testng] [1, 8, 0, 3, 5, 6, 9, 4, 7, 2]
>
> Assuming that the input to the uniqueElements operation is not already sorted and declared as such then the implementation uses a LinkedHashSet or Set (if order is to be preserved or not respectively) to hold unique elements. It never explicitly sorts the input.
>
> Paul.
>
> On Nov 30, 2012, at 3:26 PM, Georgiy Rakov<georgiy.rakov at oracle.com>  wrote:
>
>> Hello,
>> *
>> uniqueElements()* method working in parallel mode does not preserve encounter order now. Consider following code. *result *will always contain sorted numbers in spite of shuffling, i. e. [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]. I could suppose this is the used algorithm artifact.
>>
>>    import java.util.ArrayList;
>>    import java.util.Arrays;
>>    import java.util.Collections;
>>
>>    public class UniqueElementsIssue1 {
>>         public static void main(String arg[]) {
>>             ArrayList<Integer>  data = new ArrayList<>();
>>             for (int i = 0; i<10; ++i) {
>>                 for (int k = 0; k<30; ++k) {
>>                     data.add(i);
>>                 }
>>             }
>>             Collections.shuffle(data);
>>             ArrayList<Integer>  result = new ArrayList<>();
>>             Arrays.parallel(data.toArray(new
>>    Integer[0])).uniqueElements().into(result);
>>         }
>>    }
>>
>>
>> While for sequential mode (Arrays.asStream) the encounter order is preserved.
>>
>> Could you please tell if this is considered as expected behavior and will be showed in spec; for instance something like following could be there.
>> /Having been called on stream in sequential mode, UniqueElements preserve encounter order.
>> Having been called on stream in parallel mode, UniqueElements doesn't preserve encounter order.
>> /
>> The code above is attached for your convenience.
>>
>> Thanks,
>> Georgiy.
>> <UniqueElementsIssue1.java>
>



More information about the lambda-dev mailing list