I saw the following code, and wanted to use it for a simple activity which may only be executed one at a time, and won't occur frequently (so the chance of occurring twice at a time is very small, but you never know).
So the code:
// class variable
private static object syncRoot = new object();
// in a method:
lock (syncRoot)
{
DoIt();
}
When another thread comes by and wants to execute the code, how long will it wait until the lock is released? Forever, or can you somehow set a timeout?
And second: if the DoIt()
method throws an exception, is the lock still released?
When another thread comes by and wants to execute the code, how long will it wait until the lock is released?
lock
will block the the thread trying to enter the lock indefinitely until the object being locked on is released.
can you somehow set a timeout?
If you need to specify a timeout, use Monitor.TryEnter
as in
if(Monitor.TryEnter(obj, new TimeSpan(0, 0, 1))) {
try {
body
}
finally {
Monitor.Exit(obj);
}
}
if the
DoIt()
method throws an exception, is the lock still released?
Yes, a lock(obj) { body }
is translated to:
bool lockWasTaken = false;
var temp = obj;
try { Monitor.Enter(temp, ref lockWasTaken); { body } }
finally { if (lockWasTaken) Monitor.Exit(temp); }
For the gory details on what can happen when an exception is thrown, see Locks and exceptions do not mix.