我一直在阅读有关threadlocal和有用的场景。 我喜欢这个概念,但想知道它与克隆有什么不同?
因此threadlocal将返回变量的新副本,这意味着我们不必使用同步。一个很好的例子是SimpleDateFormat对象,它不是线程安全的,而ThreadLocal提供了一种很好的使用方法。 但为什么我们不能简单地创建一个新的varibale使用克隆副本?
与克隆相比,ThreadLocal类提供的增值是多少?
答案 0 :(得分:8)
ThreadLocal不能替代同步或线程安全对象访问。如果将同一对象分配给来自不同线程的ThreadLocal,那么程序不再是之前的线程安全:同一对象仍将在不同的主题之间共享。
ThreadLocal就像一个变量;也就是说,它“命名”或“引用”一个对象:
[ThreadLocal]提供了线程局部变量[..这样]访问一个线程的每个线程(通过其get或set方法)都有自己独立初始化的变量副本。
也就是说,ThreadLocal所做的是它在使用相同的ThreadLocal 对象的线程之间提供get / set隔离。因此,每个线程都可以将自己的不同的对象分配/检索到ThreadLocal;但是这仍然需要一个“克隆”或新的实例化来分配不同的对象开始!
请记住,赋值(或方法调用)永远不会创建对象的隐式克隆/复制/复制 - 这会扩展到ThreadLocal。
答案 1 :(得分:7)
通过使用ThreadLocal,您可以创建与线程一样多的变量,而无需进一步检查。但请记住,存储本身并不能保证线程安全。您必须确保仅存储在本地存储中的每个对象!
如果您手动克隆对象,则必须在每次使用时克隆对象,或者检查我们所在的线程然后克隆。
此外 - 克隆操作是否是线程安全的?如果两个不同的线程试图克隆一个对象会发生什么?我实际上不知道,但我认为这不是一个好习惯。
答案 2 :(得分:0)
使用ThreadLocal更快,存储在ThreadLocal中的SimpleDateFormat实例可以在同一个线程中重复使用多次,而克隆则意味着每次都创建一个新对象。