【发布时间】:2010-12-29 21:05:19
【问题描述】:
我有一个设计为由单个线程访问的普通类,我想让它thread-safe 这么多线程可以同时使用一个实例。我会将一些类级别的方法和变量设为静态并使用locks 将它们设为thread-safe。此外,默认情况下仅使用局部变量的方法是安全的(每个线程都有自己的堆栈)。
我的问题是关于旧班级的properties,或者更普遍的是任何non-static 变量。我可以简单地使用 ThreadLocal<T> 并且每个线程都有自己的一组 properties 吗?我肯定会在setters 中使用locks 和其他thread-safety 问题(我假设getters 是安全的)。
ThreadLocal<T> 是性能杀手吗?
【问题讨论】:
-
不描述这个类的作用,以及为什么会有多线程的干扰,没有人能给你一个好的答案。
-
您认为 ThreadLocal 究竟做了什么?因为我不认为它做你认为它做的事。你能解释一下为什么你认为线程本地存储是正确的解决方案吗?
-
@Eric:我读到它使变量成为线程的本地变量。因此,我们拥有与正在运行的线程数一样多的属性。所以对象可以有每个线程的状态。
-
那么听起来您正在寻找正确的东西。但是,我担心您的评论,即锁定需要在设置器上进行,而不是在获取器上。这没有任何意义。如果 getter 在 setter 设置属性进行到一半时运行怎么办?如果您要使用锁,那么只有始终使用它们才有意义。
-
关于性能问题:你是唯一能回答的人。编写一些基准测试并测量实际情况下的性能,看看您的用户是否可以接受该性能。我们不知道您使用的是什么硬件,消耗了多少内存,也不知道您的客户是否需要能够在两分钟或两微秒内给出正确答案的代码。
标签: c# properties thread-safety thread-local