使用ThreadLocal <t> </t>使线程安全成为普通类

时间:2010-12-29 21:05:19

标签: c# properties thread-safety thread-local

我有一个普通的类,设计为由单个线程访问,我想让它thread-safe这么多线程可以同时使用单个实例。我会创建一些类级别的方法和变量,并使用locks使它们成为thread-safe。此外,使用局部变量的方法是安全的(每个线程都有它的堆栈)。

我的问题是关于旧班级的properties或更常见的non-static变量。我可以简单地使用ThreadLocal<T>并且每个线程都拥有自己的properties集合吗?我肯定会在locks中使用thread-safety和其他setters个问题(我认为getters是安全的)。

ThreadLocal<T>性能杀手?

2 个答案:

答案 0 :(得分:2)

吸气剂并不像你想象的那么安全。 Java内存模型为每个线程提供了自己的堆视图,因此如果不同步对变量的访问,则线程可能会读取过时的数据。创建变量volatile将防止过时读取,并且对于基元来说很好,但volatile不会使访问成为原子。

java.util.concurrent包中有很多类可能会帮助你。编写线程安全的代码很棘手,所以我建议你写一本关于这个主题的好书。 Brian Goetz的“实践中的Java并发”非常好。

答案 1 :(得分:1)

那不是线程本地人的用途。它们适用于每个线程都有自己的数据的情况。

在您的情况下,我建议您将字段类型更改为Map<Object, Object>并使用Collections.synchronizedMap来确保其线程安全。