Я действительно не понимаю, является ли ваше приложение однопоточным или многопоточным. Название говорит одно, а по корпусу можно сделать вывод о другом. Я предполагаю, что вы используете более одного потока (иначе вопрос не имеет смысла — зачем вам использовать синхронизацию между... менее чем двумя потоками?!).
Там может быть более серьезная проблема, чем производительность. Видимость.
Вы не даете никаких подробностей о части кода, в которой вы ...modify a list...
, однако очень важно знать подробности: в зависимости от того, как вы это сделали, если вы удалите блокировку, что может произойти: один поток изменяет список и другой поток никогда не увидят эти модификации (или увидят частичные, скорее всего, несогласованные модификации).
Аспект синхронизации, который, кажется, вам не хватает, заключается в том, что, если не использовать какие-то конкретные конструкции (блокировки/изменяемые переменные/финальные поля), нет никаких гарантий, что один поток увидит, что другой поток сделал с памятью.
В этом случае вашу гарантию дают блокировки: когда поток T1 получает блокировку L, гарантируется, что он увидит все изменения, сделанные в памяти потоком T2 до того, как T2 освободит блокировку L.
T2 T1
acquires L
modifies a
modifies b
releases L
modifies c acquires L
reads a
reads b
reads c
releases L
В этом случае гарантируется, что T1 увидит правильные значения для a
и b
, но нет никакой гарантии, что он увидит при чтении c
.
Если вы снимаете свои блокировки, убедитесь, что ваша структура данных потокобезопасна, и, если содержащиеся данные (т. е. ваши объекты внутри списка) не являются потокобезопасными, убедитесь, что между каждой модификацией и последующим извлечением данных вы активировать отношение происходит до, иначе произойдет что-то плохое.
person
Bruno Reis
schedule
27.11.2011