我有一个设计为单个线程访问的普通类,我希望使它成为thread-safe,因此许多线程可以同时使用单个实例。有一些类级别的方法和变量,我将使它们是静态的,并使用locks使它们成为thread-safe。此外,只有使用局部变量的方法在默认情况下是安全的(每个线程都有其堆栈)。
我的问题是关于旧类的properties,或者更一般的任何non-static变量。我可以简单地使用ThreadLocal<T>,并且每个线程都有自己的properties集吗?当然,我将在locks内部使用thread-safety和其他thread-safety问题(我认为getters是安全的)。
ThreadLocal<T>是性能杀手吗?
发布于 2010-12-29 21:27:21
不像你想的那么安全。Java内存模型为每个线程提供了自己的堆视图,因此如果不同步对变量的访问,那么线程可能读取陈旧的数据。创建一个变量volatile将防止陈旧的读取,对于原语来说也很好,但是volatile不会使access成为原子化的。
java.util.concurrent包中有许多类可以帮助您解决问题。编写线程安全的代码是很棘手的,所以我建议你写一本关于这个主题的好书。Brian的“实践中的Java并发”相当不错。
发布于 2010-12-29 21:17:33
这并不是本地线程的真正用途。它们适用于每个线程都有自己的数据的情况。
在您的示例中,我建议将字段类型更改为Map<Object, Object>,并使用Collections.synchronizedMap使其线程安全。
https://stackoverflow.com/questions/4557844
复制相似问题