Я действительно не понимаю, является ли ваше приложение однопоточным или многопоточным. Название говорит об одном, а из тела мы можем вывести другое. Я предполагаю, что вы используете более одного потока (иначе вопрос не имеет смысла - зачем вам использовать синхронизацию между ... менее чем двумя потоками?!).
Там может быть более серьезная проблема, чем производительность. Видимость .
Вы не предоставляете никаких подробностей о той части кода, в которой вы ...modify a list...
, однако очень важно знать детали: в зависимости от того, как вы это сделали, если вы удалите блокировку, что может произойти is: один поток изменяет список, а другой поток не видит эти изменения (или видит частичные, скорее всего, несогласованные изменения).
Аспект синхронизации, который, по-видимому, отсутствует, заключается в том, что, если не использовать некоторые конкретные конструкции (блокировки / изменчивые переменные / конечные поля), нет никаких гарантий, что один поток увидит то, что другой поток сделал с памятью.
В этом случае ваша гарантия дается блокировками: когда поток 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
.
Если вы снимаете блокировки, убедитесь, что ваша структура данных поточно-ориентирована, и, если содержащиеся в ней данные (т. Е. Ваши объекты внутри списка) не поточнобезопасны, убедитесь, что между каждой модификацией и последующим извлечением данных, которые вы вызываете отношение случается до , в противном случае произойдут плохие вещи.