No, they are not queued, they are sleeping
A lock statement of the form
lock (x) ...
where x is an expression of a reference-type, is precisely equivalent to
var temp = x;
System.Threading.Monitor.Enter(temp);
try { ... }
finally { System.Threading.Monitor.Exit(temp); }
You just need to know that they are waiting to each other, and only one thread will enter to lock block, the others will wait...
Monitor is written fully in .net so it is enough fast, also look at class Monitor with reflector for more details