.NET
Double check pattern
I just answered a question at SO about lazy loading which involved the double check pattern. It’s a really useful pattern for lazy loading since it hurt performance a lot less than always locking.
I thought that I should share explain why by using some comments:
public sealed class Lazy<T> where T : class
{
private readonly object _syncRoot = new object();
private readonly Func<T> _factory;
private T _value;
public Lazy(Func<T> factory)
{
if (factory == null) throw new ArgumentNullException('factory');
_factory = factory;
}
public T Value
{
get
{
// here is the first check. It only returns true
// if the instance have not been created, right?
if (_value == null)
{
// so when we enter here, we are within a very small time frame:
// That is from the above check until the new instance is
// assigned to the variable.
// Which is a <strong>very</strong> small time frame
// (unless you rely on external resources).
// So let's lock to make sure that no other thread
// have already started to create the object.
lock (_syncRoot)
{
// We enter here as soon as any other thread (if there were one)
// have stopped working, which means that the value could
// have been assigned.
// So let's check if another thread have already done the work for us.
if (_value == null)
{
//no, so let's create the object.
_value = _factory();
}
}
}
return _value;
}
}
public override string ToString()
{
return _value == null ? 'Not created' : _value.ToString();
}
}
The double check pattern allows us to have lock free code (other than when the instance is created) which is a huge performance gain compared to using a single lock.
Feel free to use the code in .NET versions earlier than 4.
Reference: Double check pattern from our NCG partner Jonas Gauffin at the jgauffin’s coding den blog.