У меня очень простой вопрос:
Скажем, у меня есть класс ниже, который зарегистрирован как синглтон, и метод. Что происходит, когда Create() обрабатывается несколькими потоками? Все ли потоки получают доступ к этому методу одновременно? Если 10 потоков обращаются к этому методу, создается ли 10 переменных numbers и удаляется ли они после завершения области действия метода?
Поскольку у этого класса нет свойств уровня класса, я предполагаю, что он потокобезопасен?
// registration
builder.Services.AddSingleton<ISingleton, SingletonTest>();
public interface ISingleton
{
int Create(int number);
}
public class SingletonTest : ISingleton
{
public int Create(int number)
{
List<int> numbers = new List<int>();
numbers.Add(number);
return numbers.Count;
}
}
и при его использовании: dotnettutorials.net/lesson/thread-safe-singleton-design-pattern/….
Похоже, вы не уверены в том, что такое синглтон и/или как работает многопоточность. Или, если вы хорошо с ними разбираетесь, то это, должно быть, DI. Как вы думаете, где вам нужна помощь?





Все ли потоки получают доступ к этому методу одновременно?
Да, дополнительных методов синхронизации нет. Синглтон похож на создание статического члена и доступ к нему из нескольких потоков.
public static readonly ISingleton Instance = new SingletonTest();
Если 10 потоков обращаются к этому методу, создается ли переменная с 10 числами и удаляется ли она после завершения области действия метода?
Да, 10 numbers будут созданы, но не выпущены после выхода из этого метода. Освобождение осуществляется потоками времени выполнения, которые выполняют сборщик мусора, который освобождает выделенную память, на которую нет ссылки.
Поскольку у этого класса нет свойств уровня класса, я предполагаю, что он потокобезопасен?
Да, это потокобезопасно. Это также будет потокобезопасно, если у вас есть свойства, но не изменяемые, инициализированные один раз, например, в конструкторе.
То есть, если 10 тредов нажмут create, они получат свою собственную версию create (если это вообще имеет смысл)? Скажем thread_1, нажмем create, и появится numbers. Если thread_2 появится в то же время, я предполагаю, что он никогда не сможет получить доступ к потоку_1 numbers? Я полагаю, что если у вас есть свойства, это может привести к проблеме с состоянием гонки, верно? например, один поток добавляет элемент, а затем хочет его получить, но другой поток уже забрал этот элемент
У каждого потока будет свой numbers, numbers — переменная в стеке, у каждого потока свой стек.
большое спасибо! If you have properties, I assume, it could have race condition issue, right? e.g One thread adds and item, and later wants to retrieve it, but another thread already taken that item - если бы у вас были свойства, я предполагаю, что состояние гонки возможно?
Да, если у вас есть свойство List и потоки пытаются добавлять элементы в этот поток. У вас будут проблемы.
Список
numbersбудет создан 10 раз, один раз за звонок. Не имеет значения, все ли они из одного потока или разделены между любым количеством потоков, тогда сбор мусора (в конечном итоге) очищает эти списки.