У меня есть задача, требующая большого объема вычислений, которую я собираюсь распределить по нескольким потокам. Каждому потоку потребуется доступ к одинаковому большому String[][]. Мне интересно, повлияет ли на производительность тот факт, что всем им нужен доступ к одному и тому же String[][] в куче? Было бы лучше сделать копии этого String[][] для каждого потока для доступа индивидуально (даже если всем им нужен только доступ к одному и тому же экземпляру этого String[][])?

Обратите внимание, что для String[][] someArray = new String[100][1000000]; (например) маловероятно, чтобы в какой-то момент времени они одновременно вызывали один и тот же someArray[i]. Обычно каждый поток будет использовать разные i в любой момент времени. Однако иногда i будет одинаковым для разных потоков (в основном случайно).

Каждый поток будет доступен только для чтения someArray.

1
user2763361 9 Фев 2014 в 13:35
Когда вы пишете «нужен доступ », вам нужно его прочитать или написать тоже?
 – 
tilois
9 Фев 2014 в 13:40
1
Изменяют ли потоки массив? В таком случае вам нужно подумать о блокировках и нехватке ресурсов. В противном случае JIT будет кэшировать локальные копии, если сочтет это полезным.
 – 
Boris the Spider
9 Фев 2014 в 13:40
Только для чтения. Ничего не писать и не менять.
 – 
user2763361
9 Фев 2014 в 13:40
4
Тогда вы можете безопасно поделиться одним экземпляром вашего массива, и это не снизит производительность.
 – 
assylias
9 Фев 2014 в 13:42
Если возможно изменить поток для использования списка вместо массива, вы можете преобразовать свой массив в список и получить неизменяемый список. Я не тестировал, но считаю, что доступ из неизменяемого списка должен быть быстрее при одновременном доступе в нескольких потоках.
 – 
Parvez
9 Фев 2014 в 13:55

1 ответ

Лучший ответ

Если вы только читаете значения, это не должно быть проблемой. Даже неважно, читают ли они одно и то же «я». Проблемы возникают, когда вы начинаете писать в общую память ...

РЕДАКТИРОВАТЬ: удален сбивающий с толку комментарий синхронизации.

3
nicktalbot 9 Фев 2014 в 13:49
Если есть синхронизация, это проблема, если они читают один и тот же i (с точки зрения производительности)?
 – 
user2763361
9 Фев 2014 в 13:42
2
Да, конечно. Синхронизация требует огромных затрат, о которых мы говорим. Более того, два потока не могут читать один и тот же i, если есть синхронизация - в этом весь смысл. Таким образом, вы должны добавить стоимость потенциальной нехватки ресурсов к уже и без того большой стоимости синхронизации.
 – 
Boris the Spider
9 Фев 2014 в 13:44
1
Вы не можете синхронизировать один элемент массива, так что это не проблема. Вы либо заблокируете все это, либо вообще ничего, и в этом случае «i» не имеет значения. Совместное использование данных только для чтения не вызовет проблем. Нет необходимости синхронизировать данные только для чтения.
 – 
nicktalbot
9 Фев 2014 в 13:46
Синхронизация одного элемента массива может быть бесполезной, но, конечно, не невозможна. Вам просто понадобится много замков.
 – 
Marko Topolnik
9 Фев 2014 в 15:07
Топольник Да, это возможно с дополнительными объектами
 – 
nicktalbot
9 Фев 2014 в 15:18