DI注入单例类多线程调用方法的线程安全与变量生命周期问题
单例类多线程调用方法的线程安全性问题
问题描述
假设将如下类注册为单例,当多线程调用其Create()方法时会发生什么?所有线程能否同时访问该方法?若有10个线程调用此方法,是否会创建10个numbers变量并在方法作用域结束后被销毁?由于该类没有任何类级属性,我认为它是线程安全的,这个判断是否正确?
代码示例
// 注册代码 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; } }
解答
- 多线程调用
Create()的行为:多个线程可以同时访问该方法。因为Create()方法内的所有变量(包括numbers)都是局部变量,每个线程调用方法时,会在自身的线程栈上独立分配这些变量的内存空间,线程间的局部变量完全隔离,不会互相干扰。 - 10个线程调用的变量创建与销毁:是的,10个线程会各自创建10个独立的
numbers实例。每个numbers的生命周期仅限于当前线程的方法执行过程,方法执行完毕退出作用域后,这些局部变量会成为垃圾,后续被.NET垃圾回收器回收。 - 线程安全性判断:你的判断完全正确。线程安全问题的核心是共享状态的并发访问,而这个单例类没有任何类级(实例或静态)成员变量,所有状态都封装在方法内部的局部变量中,不存在多线程共享同一状态的情况,因此完全是线程安全的。
内容的提问来源于stack exchange,提问作者stuck_inside_task
相关产品推荐
相关产品推荐

