The lock keyword marks a statement block as a critical section by obtaining the mutual-exclusion lock for a given object, executing a statement, and then releasing the lock
The expression reference type in lock(expression) should not be null.
The lock keyword ensures that one thread does not enter a critical section of code while another thread is in the critical section. If another thread tries to enter a locked code, it will wait, block, until the object is released.
The section Threading (C# Programming Guide) discusses threading.
The lock keyword calls Enter at the start of the block and Exit at the end of the block.