Tread-safety

Oct 19, 2006 14:35


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

private SomeClass someProperty = null ( Read more... )

programming

Leave a comment

Comments 12

dreimora October 19 2006, 10:52:15 UTC
Любопытно..
А они правы в своих разъяснениях ?

Reply

orlangur_8eyed October 19 2006, 10:56:48 UTC
По крайней мере без использования memory barrier и/или volatile, да. Они утверждают, однако, что без безусловного lock вообще не обойтись - этого я ещё не проверял. (Хотя, возможно, они не учитывают каких-либо особенностей .NET - там статья без привязки к платформе.)

Reply

dreimora October 19 2006, 11:00:24 UTC
любопытно...

Reply


walter_simons October 19 2006, 18:35:00 UTC
Вы бы не могли накидать риалтайм драйвер сзнания (по алгоритму Бодякина) на досуге? ;) буду очень признателен!

Reply

orlangur_8eyed October 20 2006, 11:45:50 UTC
«Информоград», говоришь? Не знаю, не встречался ранее с этим. Нужно будет почитать. Не можешь кинуть ссылку на описание непосредственно алгоритма, чтобы меньше искать?

Reply

(The comment has been removed)

orlangur_8eyed October 20 2006, 17:27:53 UTC
Ты уверен, что это описание именно алгоритма? То, что дано в презентации очень неконкретно и оперирует какими-то сторонними понятиями «энергетики». И реализацией этого алгоритма должна быть программа построения нейролингвистической сети, как я понял после поверхностного просмотра.

Reply


gornik November 5 2006, 12:13:30 UTC
В .NET, эта проблема решена на уровне CLR.

Это написано в MSDN в описании паттерна синглетона.

Reply

orlangur_8eyed November 6 2006, 02:53:11 UTC
Где? Не нашёл что-то? Можешь цитату дать?

Reply

gornik November 6 2006, 11:52:44 UTC
ms-help://MS.MSDNQTR.v80.en/MS.MSDN.v80/MS.ENTSERV.v10.en/dnpatterns/html/ImpSingletonInCsharp.htm

Reply

orlangur_8eyed November 7 2006, 04:43:02 UTC

Ага. Вот этот код действительно работает:

public sealed class Singleton
{
private static volatile Singleton instance;
private static object syncRoot = new Object();

private Singleton() {}

public static Singleton Instance
{
get
{
if (instance == null)
{
lock (syncRoot)
{
if (instance == null)
instance = new Singleton();
}
}

return instance;
}
}
}

Но. Заметь обязательное использование volatile.

Reply


Leave a comment

Up