РЕДАКТИРОВАТЬ: Хорошо, теперь работает.Я не знаю точно, что было худшей проблемой, но я не сделал некоторые блокировки, которые были необходимы, чтобы избежать условий гонки.Также я добавил ключевое слово «volatile» в объявление переменной экземпляра синглтона.
, если у меня запущено несколько потоков и в одном потоке я обращаюсь к синглтону (который, возможно, был создан в другом потоке)я получаю свежий "синглтон" с точки зрения того, что конструктор синглтона вызывается для каждого потока, который обращается к нему в своем пространстве памяти в первый раз?Я понял это правильно?
Проблема в моем приложении, у меня есть синглтон, созданный основным потоком.Если я затем вызываю Singleton.Instance.somemethod (...), я всегда получаю исключения нулевого указателя или пустые списки, даже если списки были созданы и заполнены в основном потоке?проблема, так что я могу использовать один и тот же экземпляр синглтона во всех запущенных потоках?Какой-то способ синхронизации всего экземпляра?
Спасибо.
РЕДАКТИРОВАТЬ: Извините, что не хватает действительно важной информации.Я использую C # и .NET Framework 4.0 под Visual Studio 2010 Professional.
Я создаю Singleton следующим образом:
static readonly object _padlock = new object();
public static StaticAnalyzer Instance
{
get
{
lock (_padlock)
{
if (_instance == null)
{
_instance = new StaticAnalyzer();
}
return _instance;
}
}
}
В фоновом режиме каждый поток имеет свое собственное пространство виртуальной памяти илине?Итак, если я создаю синглтон в главном потоке, а затем создаю несколько рабочих потоков с помощью task.factory, а рабочие потоки вызывают экземпляр, почему они получают настоящий синглтон?из-за статического ключевого слова?