I see that for using objects which are not thread safe we wrap the code with a lock like this:
private static readonly Object obj = new Object();
lock (obj)
{
// thread unsafe code
}
So what happens when multiple threads access the same code (let's assume that it is running in a ASP.NET web application). Are they queued? If so how long will they wait?
What is the performance impact because of using locks?
The
lock
statement is translated to calls to theEnter
andExit
methods ofMonitor
.The
lock
statement will wait indefinitely for the locking object to be released.lock is actually hidden Monitor class.
No, they are not queued, they are sleeping
A lock statement of the form
where x is an expression of a reference-type, is precisely equivalent to
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
Its simpler than you think.
According to Microsoft: 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
lock
keyword callsEnter
at the start of the block andExit
at the end of the block.lock
keyword actually handlesMonitor
class at back end.For example:
In above code first thread enters critical section then it will lock
obj
and when other thread tries to enter then it will also try to lockobj
which is already locked by first thread, I will have to wait for first thread to releaseobj
. and when first will leave then other thread will lockobj
and will enter to critical section.The performance impact depends on the way you lock. You can find a good list of optimizations here: http://www.thinkingparallel.com/2007/07/31/10-ways-to-reduce-lock-contention-in-threaded-programs/
Basically you should try to lock as little as possible, since it puts your waiting code to sleep. If you have some heavy calculations or long lasting code (e.g. file upload) in a lock it results in a huge performance loss.
Locks will block other threads from executing the code contained in the lock block. The threads will have to wait until the thread inside the lock block has completed and the lock is released. This does have a negative impact on performance in a multithreaded environment. If you do need to do this you should make sure the code within the lock block can process very quickly. You should try to avoid expensive activities like accessing a database etc.