Учитывая одноэлементный класс, внедренный через DI, что происходит, когда несколько потоков обращаются к одноэлементному методу?

У меня очень простой вопрос: Скажем, у меня есть класс ниже, который зарегистрирован как синглтон, и метод. Что происходит, когда 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;
     }
 }

Список numbers будет создан 10 раз, один раз за звонок. Не имеет значения, все ли они из одного потока или разделены между любым количеством потоков, тогда сбор мусора (в конечном итоге) очищает эти списки.

Luke 09.05.2024 19:54
stackoverflow.com/questions/12316406/…
Power Mouse 09.05.2024 20:23

и при его использовании: dotnettutorials.net/lesson/thread-safe-singleton-design-patt‌​ern/….

Power Mouse 09.05.2024 20:25

Похоже, вы не уверены в том, что такое синглтон и/или как работает многопоточность. Или, если вы хорошо с ними разбираетесь, то это, должно быть, DI. Как вы думаете, где вам нужна помощь?

Enigmativity 12.05.2024 03:30
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
65
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Все ли потоки получают доступ к этому методу одновременно?

Да, дополнительных методов синхронизации нет. Синглтон похож на создание статического члена и доступ к нему из нескольких потоков.

public static readonly ISingleton Instance = new SingletonTest();

Если 10 потоков обращаются к этому методу, создается ли переменная с 10 числами и удаляется ли она после завершения области действия метода?

Да, 10 numbers будут созданы, но не выпущены после выхода из этого метода. Освобождение осуществляется потоками времени выполнения, которые выполняют сборщик мусора, который освобождает выделенную память, на которую нет ссылки.

Поскольку у этого класса нет свойств уровня класса, я предполагаю, что он потокобезопасен?

Да, это потокобезопасно. Это также будет потокобезопасно, если у вас есть свойства, но не изменяемые, инициализированные один раз, например, в конструкторе.

То есть, если 10 тредов нажмут create, они получат свою собственную версию create (если это вообще имеет смысл)? Скажем thread_1, нажмем create, и появится numbers. Если thread_2 появится в то же время, я предполагаю, что он никогда не сможет получить доступ к потоку_1 numbers? Я полагаю, что если у вас есть свойства, это может привести к проблеме с состоянием гонки, верно? например, один поток добавляет элемент, а затем хочет его получить, но другой поток уже забрал этот элемент

stuck_inside_task 09.05.2024 23:01

У каждого потока будет свой numbers, numbers — переменная в стеке, у каждого потока свой стек.

Svyatoslav Danyliv 09.05.2024 23:16

большое спасибо! 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 - если бы у вас были свойства, я предполагаю, что состояние гонки возможно?

stuck_inside_task 09.05.2024 23:43

Да, если у вас есть свойство List и потоки пытаются добавлять элементы в этот поток. У вас будут проблемы.

Svyatoslav Danyliv 10.05.2024 06:10

Другие вопросы по теме