To get a clearer picture of what’s going on, I looked at the source code for the Monitor class and its C ++ instance in clr/src/vm/syncblk.cpp in the Microsoft shared sharing infrastructure.
To answer my own question: no, the presence of a large number of locks will not harm in any harmful way that I could think of.
What I learned:
1) A castle that is already occupied by the same thread is processed "almost for free."
2) The lock accepted for the first time is basically the cost of InterlockedCompareExchange .
3) Several threads awaiting blocking are cheap enough for tracking (list of links supported, O (1) complexity).
4) The thread waiting for the lock to be released is by far the most expensive precedent, the first call that must be made to try to get out, but if this is not enough, the thread will switch, mutex signals that the time is waking up due to the lock.
I got my answer by digging 2): if you always block the same object or 10K the other, it is basically the same (additional initialization is performed the first time this object is blocked, but this is not too bad). InterlockedCompareExchange does not care about being called in the same or another memory location (AFAIK).
Conflict is by far the most important issue. Having many locks would reduce (in my case) the likelihood of a dispute, so this can only be good.
1) is also an important scientific lesson: if I lock / unlock for each property / access change, I can improve performance by first locking the object and then changing many properties and releasing the lock. Thus, there will be only one InterlockedCompareExchange, and locking / unlocking inside the implementation of changing properties / access will only increase the internal counter.
To dig deeper, I would have to find more information on the implementation of InterlockedCompareExchange, I think that it relies on instructions for building the processor ...