4

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

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

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

4

3 回答 3

8

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

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

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

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

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

于 2013-01-20T07:24:04.053 回答
7

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

如果您手动克隆对象,则必须在每次使用对象时克隆它,或者检查我们在哪个线程中然后克隆。

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

于 2013-01-20T07:06:45.003 回答
0

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

于 2013-01-20T07:21:58.830 回答