Во-первых, на каждого пользователя поток не создаётся. Потоки берутся из пула, а потому должны как можно быстрее обработать запрос и вернуться обратно.
Во-вторых, синхронизация может происходить внутри высокоуровневых абстракций фреймворка, которые вы используете. Или, как правильно заметил
Dmitry Roo, конкурентный доступ может разрузиваться другими механизмами.