首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ThreadLocal与克隆

ThreadLocal与克隆
EN

Stack Overflow用户
提问于 2013-01-20 15:00:08
回答 3查看 1.4K关注 0票数 4

我一直在阅读有关threadlocal和它有用的场景的文章。我喜欢这个概念,但想知道它与克隆有什么不同?

所以一个threadlocal将返回一个变量的新副本,这意味着我们不需要使用同步。一个很好的例子是SimpleDateFormat对象,它不是线程安全的,而ThreadLocal提供了一个很好的使用方法。但是为什么我们不能简单地用clone创建一个新的varibale副本呢?

与克隆相比,ThreadLocal类提供的附加值是什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-20 15:06:45

通过使用ThreadLocal,您可以创建与线程数量一样多的变量,而不需要任何进一步的检查。但是请记住,存储本身并不保证线程安全。您必须确保存储在本地存储中的每个对象仅从该线程使用!

如果您手动克隆对象,则必须在每次使用对象时克隆对象,或者检查我们所在的线程,然后进行克隆。

此外-克隆操作是线程安全的吗?如果两个不同的线程试图克隆一个对象,会发生什么?我其实不知道,但我认为这不是一个好的做法。

票数 7
EN

Stack Overflow用户

发布于 2013-01-20 15:24:04

不是同步或线程安全对象访问的替代品。如果从不同的线程将相同的对象分配给ThreadLocal,那么该程序的线程安全性就不会比以前更高:相同的对象仍然会在不同的线程之间共享。

ThreadLocal的行为就像一个变量;也就是说,它“命名”或“引用”一个对象:

[ThreadLocal]提供了线程局部变量..这样访问一个变量的每个线程(通过它的get或set方法)都有它自己的、独立初始化的变量副本。

也就是说,ThreadLocal所做的是在使用相同ThreadLocal对象的线程之间提供get/set隔离。因此,每个线程都可以向ThreadLocal分配/检索自己的不同对象;但这仍然需要“克隆”或新的实例化来分配不同的对象!

请记住,赋值(或方法调用)永远不会创建对象的隐式克隆/复制/复制-这一点扩展到了ThreadLocal。

票数 8
EN

Stack Overflow用户

发布于 2013-01-20 15:21:59

使用ThreadLocal更快,存储在ThreadLocal中的SimpleDateFormat实例可以在同一线程中多次重用,而克隆意味着每次都会创建一个新对象。

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

https://stackoverflow.com/questions/14422408

复制
相关文章

相似问题

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