Использование массивов в parallelStream
От: Stas0n  
Дата: 17.12.15 19:27
Оценка:
Безопасно ли использовать массивы в parallelStream? Речь идет о заполнении массива и обращениях к элементам.

int range = 1000000;
 
    int[] arr1 = new int[range];
    int[] arr2 = new int[range];
 
    // заполнение массивов
    IntStream.range(0, range).parallel()
        .forEach(i -> {
            arr1[i] = method1(i);
            arr2[i] = method2(i);
        });
 
    // обращение к элементам
    double sum = IntStream.range(0, range).parallel()
            .mapToDouble(i -> {
                return Math.min(arr1[i]/arr2[i], 0d);
            })
            .reduce(0, Double::sum);


Потокобезопасно ли делать так?
Re: Использование массивов в parallelStream
От: · Великобритания  
Дата: 17.12.15 19:44
Оценка: +1
Здравствуйте, Stas0n, Вы писали:

S> Потокобезопасно ли делать так?

Обращение точно безопасно.
Заполнение, по-моему, тоже да.
Единственное что false sharing может быть. Как parallel() массивы распределяет? Если просто режет на куски, то вроде всё ок должно быть.
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[2]: Использование массивов в parallelStream
От: · Великобритания  
Дата: 17.12.15 19:49
Оценка:
Здравствуйте, ·, Вы писали:

·> Единственное что false sharing может быть. Как parallel() массивы распределяет? Если просто режет на куски, то вроде всё ок должно быть.

Хотя нет, тоже всё ок, по крайней мере в приведённом коде: чтение и запись не происходят конкурентно.
avalon/1.0.432
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: Использование массивов в parallelStream
От: Blazkowicz Россия  
Дата: 18.12.15 05:58
Оценка:
Здравствуйте, Stas0n, Вы писали:

Немного оффтоп, но тут же постоянный автобоксинг будет. Как здесь
Автор: rminko
Дата: 18.11.15
Re[2]: Использование массивов в parallelStream
От: GarryIV  
Дата: 18.12.15 06:21
Оценка: +1
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, Stas0n, Вы писали:


B>Немного оффтоп, но тут же постоянный автобоксинг будет. Как здесь
Автор: rminko
Дата: 18.11.15


В каком месте? Вроде везде примитивы.
WBR, Igor Evgrafov
Re[3]: Использование массивов в parallelStream
От: Blazkowicz Россия  
Дата: 18.12.15 07:15
Оценка:
Здравствуйте, GarryIV, Вы писали:

GIV>В каком месте? Вроде везде примитивы.

Гоню. Забыл что стримы для примитивов доделали.
Re: Использование массивов в parallelStream
От: fixxer  
Дата: 18.12.15 08:19
Оценка: +1
А зачем тут в принципе стейт?

int range = 1000000;
IntStream.range(0, range)
    .parallel()
    .mapToDouble(i -> Math.min(method1(i)/(double) method2(i), 0d))
    .sum()
Re[2]: Использование массивов в parallelStream
От: Blazkowicz Россия  
Дата: 18.12.15 08:59
Оценка:
Здравствуйте, fixxer, Вы писали:

F>А зачем тут в принципе стейт?

Верное замечание.

F>
F>    Math.min(method1(i)/(double) method2(i), 0d))
F>

Я против такого кода. Мало того что лямбды и стримы дебагать не сильно удобно. А вот с такими вложенными вызовами методов всё становится ещё хуже.
Компактно. Но не всегда удобно. Лучше всю лямбду в метод унести. Тогда читается хорошо.
Re[3]: Использование массивов в parallelStream
От: fixxer  
Дата: 18.12.15 09:58
Оценка:
Здравствуйте, Blazkowicz, Вы писали:

B>Здравствуйте, fixxer, Вы писали:


F>>А зачем тут в принципе стейт?

B>Верное замечание.

F>>
F>>    Math.min(method1(i)/(double) method2(i), 0d))
F>>

B>Я против такого кода. Мало того что лямбды и стримы дебагать не сильно удобно. А вот с такими вложенными вызовами методов всё становится ещё хуже.
B>Компактно. Но не всегда удобно. Лучше всю лямбду в метод унести. Тогда читается хорошо.

Вкусовщина, как по мне. У меня правило буравчика, что если я хочу дебажить лямбду, значит я что-то делаю не так.
Хотя, когда лямбда становится громоздкой, тоже предпочитаю ссылки на метод.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.