ThreadLoal简述

作者:winwill2012
链接:https://www.zhihu.com/question/23089780/answer/62097840
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

看看JDK中的源码是怎么写的:

This class provides thread-local variables. These variables differ from their normal counterparts in that each thread that accesses one (via its {@code get} or {@code set} method) has its own, independently initialized copy of the variable. {@code ThreadLocal} instances are typically private static fields in classes that wish to associate state with a thread (e.g., a user ID or Transaction ID).

翻译过来大概是这样的:ThreadLocal类用来提供线程内部的局部变量。这种变量在多线程环境下访问(通过get或set方法访问)时能保证各个线程里的变量相对独立于其他线程内的变量。ThreadLocal实例通常来说都是private static类型的,用于关联线程和线程的上下文。

可以总结为一句话:
ThreadLocal的作用是提供线程内的局部变量,这种变量在线程的生命周期内起作用,减少同一个线程内多个函数或者组件之间一些公共变量的传递的复杂度。

ThreadLoal:解决了线程上下文中的变量传递问题;用于线程共享数据,使得共享数据更加方便了

ThreadLocal是否会造成内存泄漏?

每一个线程对资源副本都有一个弱引用weekRefrence:只要线程还在运行,使用ThreadLocal就是可以获取的。当一个线程运行结束销毁时,所有的资源副本都是可以被垃圾回收的(ThreadLocalMap对象保存在Thread对象中,当某个线程终止后,存储在其中的线程隔离的变量,也将作为Thread实例的垃圾被回收掉,所以完全不用担心内存泄漏的问题),这段注释表明,ThreadLocal的使用是不会造成内训泄露的。

ThreadLocal是用来维护线程中的变量不被其他线程干扰而出现的一个结构,内部包含一个ThreadLocalMap类,该类为Thread类的一个局部变量,该Map存储的key为ThreadLocal对象自身,value为我们要存储的对象,这样一来,在不同线程中,持有的其实都是当前线程的变量副本,与其他线程完全隔离,以此来保证线程执行过程中不受其他线程的影响。

1.简述ThreadLocal

ThreadLocal实例通常作为静态的私有的(private static)字段出现在一个类中,这个类用来关联一个线程。ThreadLocal是一个线程级别的局部变量,下面是线程局部变量(ThreadLocal variables)的关键点:

A、当使用ThreadLocal维护变量时,若多个线程访问ThreadLocal实例,ThreadLocal为每个使用该变量的线程提供了一个独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其他线程所对应的副本。

B、从线程的角度看,目标变量就像是线程的本地变量,这也是类名中Local所要表达的意思。

5.总结

ThreadLocal一般都是声明在静态变量中,如果不断地创建ThreadLocal而没有调用其remove方法,将导致内存泄露,特别是在高并发的Web容器当中。

ThreadLocal在处理线程的局部变量时比synchronized同步机制解决线程安全问题更简单,更方便,且程序拥有更高的并发性。

什么是ThreadLocal
该类提供了线程局部变量,就是为每一个使用它的线程提供一个变量的副本,使每一个
线程可以独立的改变自己的副本,而不会和其它线程发生冲突。说白了就是解决对线程访问共享
资源时发生冲突的问题,也算是一种同步的方式。

思路就是他的底层维护了一个线程安全的Map,Map就以键值对的形式存储线程对象和线程对象的副本值。

ThreadLocal与其他同步机制的区别:
ThreadLocal与普通的同步机制都是为了解决多线程访问共享资源时会产生冲突的问题,普通的同步机制是控制了线程对共享资源的
访问时间而避免冲突的,他是多个线程进行通信的有效方式,而ThreadLocal则是在空间上对共享数据进行了隔离,从根本上来说,数据已经不在共享了以此避免冲突。因此两种方式是在不同的角度所实现的线程安全。
当我们需要多线程之间进行通信就使用同步机制,需要隔离多个线程之间的共相冲突,就是用ThreadLocal。

你可能感兴趣的:(ThreadLoal简述)