a set of context-bound objects which share a lock (through SynchronizationAttribute) are said to be in a synchronization domain
if a client is calling any object in the synchronization domain, it needs to acquire this lock, once the lock is acquired, no other clients can access any object in the synchronization domain
If this client calls WaitOne, it has a choice to stay in the synchronization domain (with the second parameter exitContext set to false), so it will keep the lock (then no other clients can access any object in the domain during the waiting period), or it can leave the synchronization domain (with the second parameter exitContext set to true) and the system will release the lock, so other clients can access the objects in the synchronization domain