Прежде всего, это деталь реализации. Есть много способов реализовать это, и реализация CLR может свободно выбирать то, что ей нравится.
Несколько возможных реализаций:
- Используйте блокировку, как вы предлагаете
- Используйте «безблокировочные» методы, такие как
Interlocked.Exchange
- Выделите из разных областей в каждой теме. Например, имея отдельную кучу Gen0 на поток.