2013-09-17 4 views
3

, если мы создаем, например, 3 потока T1, T2 и T3, которые вызывают одну и ту же функцию или процедуру каждый из них, тогда, если мы будем называть их на некоторое количество времени T1.start() T2.start() T3.start(), это сработает? ? или нам нужно их синхронизировать?Несколько потоков Совместное использование одной и той же функции

ответ

3

Вы не синхронизируете функции, вы синхронизируете их доступ к ресурсам.

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


* ресурс может быть переменным членом, статической или не статичен, объект в памяти, объект операционной системы, такие как файл или сокет, сборник, и так далее.

+0

У меня есть «Вектор», и я думал о создании 5 «Ниток», которые одновременно добавляют элементы в «Вектор», поэтому я предполагаю, что моя идея невозможна? –

+0

@GhassenBellagha Добавление к вектору аннулирует коллекцию, поэтому вы правы, вы не можете сделать это с вектором без синхронизации. Если вы планируете добавлять элементы только в конце вектора, вы можете использовать ['BlockingQueue '] (http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/BlockingQueue. html) без дополнительной синхронизации. – dasblinkenlight

+0

Итак, в этом случае нет необходимости в 'Threads', я имею в виду, что я могу вызывать нормальные функции вместо' Threads', потому что он, похоже, дает те же результаты!? Даже с 'BlockingQueue ' 'Threads' не будет работать параллельно, так что то же самое с рабочей инструкцией после инструкции ..? –

1

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

Смежные вопросы