В настоящее время у меня есть следующий класс:Является ли Structuremap singleton потоком безопасным?
public class PluginManager
{
private static bool s_initialized;
private static object s_lock = new object();
public static void Initialize() {
if (!s_initialized) {
lock (s_lock) {
if (!s_initialized) {
// initialize
s_initialized = true;
}
}
}
}
}
Важным моментом здесь является то, что Initialize() должна быть выполнена только один раз в то время как приложение работает. Я думал, что я бы реорганизовать это в одноплодный класс, так как это было бы более поточно ?:
public sealed class PluginService
{
static PluginService() { }
private static PluginService _instance = new PluginService();
public static PluginService Instance { get { return _instance; } }
private bool s_initialized;
public void Initialize() {
if (!s_initialized)
{
// initialize
s_initialized = true;
}
}
}
Вопрос один, он по-прежнему необходим иметь блокировку здесь (я удалил его), так как мы будем только когда-либо работать над одним и тем же экземпляром?
Наконец, я хочу использовать DI и структуру карту, чтобы инициализировать мой servcices поэтому я переработан, как показано ниже:
public interface IPluginService {
void Initialize();
}
public class NewPluginService : IPluginService
{
private bool s_initialized;
public void Initialize() {
if (!s_initialized) {
// initialize
s_initialized = true;
}
}
}
И в моем реестре:
ForRequestedType<IPluginService>()
.TheDefaultIsConcreteType<NewPluginService>().AsSingletons();
Это работает, как ожидалось (Singleton возвращая значение true в следующем коде):
var instance1 = ObjectFactory.GetInstance<IPluginService>();
var instance2 = ObjectFactory.GetInstance<IPluginService>();
bool singleton = (instance1 == instance2);
Так что мой следующий вопрос: решение структурной карты как потокобезопасное, как класс singleton (второй пример). Единственным недостатком является то, что это все равно позволит напрямую создавать NewPluginService (если не использовать структурную карту).
Большое спасибо, Бен
@ Lirik - отличная благодарность. Какие из этих предложений будут применяться при использовании структуры структуры для получения экземпляра? –
@Ben Вы инициализируете экземпляр каждый раз, когда получаете его из структурированной карты? Получаете ли вы доступ к структурированной карте из нескольких потоков, чтобы получить экземпляры? – Kiril
@Lirik - это была моя точка на самом деле. StructureMap имеет метод AsSingletons для маркировки экземпляра как одноэлементного. Я хотел бы знать, будет ли это предлагать ту же безопасность потоков, что и у меня с жестко закодированным синглом (в дополнение к вашим предложениям). –