0

我有一个设计为由单个线程访问的普通类,我想让它有thread-safe这么多线程可以同时使用一个实例。有一些类级别的方法和变量,我将它们设为静态并使用locks它们thread-safe。默认情况下,使用局部变量的方法也是安全的(每个线程都有它的堆栈)。

properties对旧班级或更一般地任何non-static变量的疑问。我可以简单地使用ThreadLocal<T>并且每个线程都有自己的一组properties吗?我肯定会在里面使用locks和其他thread-safety问题setters(我认为getters是安全的)。

ThreadLocal<T>性能杀手吗?

4

2 回答 2

2

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

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

于 2010-12-29T21:27:21.517 回答
1

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

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

于 2010-12-29T21:17:33.867 回答