@Tejs,
Actually, in .NET you do not need to use the double check locking mechanism - there are better ways around it. But if you decide to do this, your double-check lock implementation is incorrect and not truly thread-safe. The compiler can optimize initialization _instance = new PrintStringDataBuilder(); - There are 3 possible modifications to make your example truly thread safe:
- initializing a static inline member is definitely the easiest one!
private static PrintStringDataBuilder _instance = new PrintStringDataBuilder; public static PrintStringDataBuilder GetInstance() { return _instance; }
2. Use the "volatile" keyword to ensure that the initialization of PrintStringDataBuilder not JIT optimized.
private static volatile PrintStringDataBuilder _instance = null; private static object _lockObject = new object(); public static PrintStringDataBuilder GetInstance() { if(_instance == null) { lock(_lockObject) { if(_instance == null) { _instance = new PrintStringDataBuilder(); } } } return _instance; }
3. Use Interlocked.Exchange with double check locking:
private static PrintStringDataBuilder _instance = null; private static object _lockObject = new object(); public static PrintStringDataBuilder GetInstance() { if(_instance == null) { lock(_lockObject) { if(_instance == null) { var temp = new PrintStringDataBuilder(); Interlocked.Exchange(ref _instance, temp); } } } return _instance; }
Hope this helps.
Dave black
source share