Tread-safety

Oct 19, 2006 14:35


В прошлом я не раз пользовался так называемым double-checked locking для ускорения инициализации разделяемой неизменяемой переменной. Т.е. вместо кода вида

private SomeClass someProperty = null; public SomeClass SomeProperty { get { lock (this) { if (someProperty == null) someProperty = new SomeClass(); return someProperty; } } }
использовал код вида

private SomeClass someProperty = null; public SomeClass SomeProperty { get { if (someProperty == null) { lock (this) { if (someProperty == null) someProperty = new SomeClass(); } } return someProperty; } }
Однако в статье «The “Double-Checked Locking is Broken” Declaration» (на английском) объясняется, почему так делать нельзя.

Как выяснилось, в C# достаточно описать someProperty как volatile и всё будет работать.

programming

Previous post Next post
Up