首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ThreadLocal<T>使线程安全成为一个普通类。

使用ThreadLocal<T>使线程安全成为一个普通类。
EN

Stack Overflow用户
提问于 2010-12-29 21:05:19
回答 2查看 966关注 0票数 0

我有一个设计为单个线程访问的普通类,我希望使它成为thread-safe,因此许多线程可以同时使用单个实例。有一些类级别的方法和变量,我将使它们是静态的,并使用locks使它们成为thread-safe。此外,只有使用局部变量的方法在默认情况下是安全的(每个线程都有其堆栈)。

我的问题是关于旧类的properties,或者更一般的任何non-static变量。我可以简单地使用ThreadLocal<T>,并且每个线程都有自己的properties集吗?当然,我将在locks内部使用thread-safety和其他thread-safety问题(我认为getters是安全的)。

ThreadLocal<T>是性能杀手吗?

EN

回答 2

Stack Overflow用户

发布于 2010-12-29 21:27:21

不像你想的那么安全。Java内存模型为每个线程提供了自己的堆视图,因此如果不同步对变量的访问,那么线程可能读取陈旧的数据。创建一个变量volatile将防止陈旧的读取,对于原语来说也很好,但是volatile不会使access成为原子化的。

java.util.concurrent包中有许多类可以帮助您解决问题。编写线程安全的代码是很棘手的,所以我建议你写一本关于这个主题的好书。Brian的“实践中的Java并发”相当不错。

票数 2
EN

Stack Overflow用户

发布于 2010-12-29 21:17:33

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

在您的示例中,我建议将字段类型更改为Map<Object, Object>,并使用Collections.synchronizedMap使其线程安全。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4557844

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档