Относительно значения синхронизации - PullRequest
3 голосов
/ 04 ноября 2010

Это может быть глупый вопрос, но я новичок в многопоточном программировании на Java. Я создал 4 потока и затем вызвал для них метод run. В методе run я использую массив и присваиваю значения это индексы. Я вижу, что каждый поток поддерживает свою собственную копию массива, и нет никакого небезопасного поведения потока. Я просто хотел знать, что в этом случае имеет значение при использовании синхронизации (я думал, что она использовалась для управления доступом к общему ресурсу. Разве массив не должен быть здесь общей структурой данных?)

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

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

Совместное использование было бы, если бы у вас был один массив, и все четыре потока работали с этим массивом, по крайней мере с возможностью для двух потоков использовать одни и те же данные одновременно. В таком случае вам потребуется синхронизация, чтобы гарантировать, что только один из них пытался (например) написать в любое конкретное место в любое время (или что, если кто-то читал, а другой писал, что запись была сделана атомарно, с чтение происходит либо полностью перед записью, либо полностью после нее, но им не разрешается перекрываться).

1 голос
/ 04 ноября 2010

До тех пор, пока вы абсолютно уверены, что массивы ПОЛНОСТЬЮ отличаются (здесь нужно быть осторожным, поскольку в зависимости от того, что вы сделали, могут быть указатели на один и тот же объект), вам не нужно синхронизировать массив.

0 голосов
/ 04 ноября 2010

Это зависит от того, что вы подразумеваете под «в методе выполнения я использую массив» (ударение на использовании)? Если вы передали ссылку на массив в поток, тогда да, синхронизация предотвратит одновременный доступ к массиву. Однако, если вы создаете экземпляр в массиве в потоке, то у вас есть 4 отдельных экземпляра массива, и синхронизация не имеет никакого эффекта. 1001 *

0 голосов
/ 04 ноября 2010

Если ваши потоки выполняют операции только с собственными личными данными, синхронизация не требуется.

Кстати, вы говорите, что «вызвали метод run» в своих потоках;прямой вызов Thread.run () не будет выполнять вашу логику в новом потоке;Вместо этого вы захотите вызвать Thread.start () (который внутренне выполняет run () в отдельном потоке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...