lock
не бесплатно. имеет , чтобы проверить определенные вещи, прежде чем вернуться. Сколько вещей и что нужно делать, зависит от реализации. Я бы предположил , что этот вид использования распространен, и MS выполнила некоторую оптимизацию для этого варианта использования.
Я бы по-прежнему рекомендовал, чтобы у вас была отдельная реализация AddRange, в которой все было сделано за один раз. Это, конечно, зависит от остального интерфейса класса (есть ли слушатели и могут ли они получать сообщения о том, что несколько объектов были добавлены и т. Д.).
Это довольно простой тестовый сценарий, сделать несколько миллионов вложенных блокировок (что вы предлагаете) и то же самое с другой блокировкой.
Обратите внимание также на другой возможный порядок, если вы используете не вложенную блокировку, вы можете получить объект в середине диапазона, который вы добавляете:
AddRange _sync1
AddItem _sync2
AddItem _sync2
--- interruption, other thread calls:
AddItem _sync2
--- AddRange again:
AddItem _sync2
При синхронизации с одним _syncObject никто не может прерывать, поскольку блокировка уже удерживается другим потоком.