详解Java多线程与高并发(七)__ThreadLocal

线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。

Java提供了ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。

ThreadLocal将值和线程绑定,避免了多线程情况下的数据同步问题,杜绝了线程之间的干扰。

底层实现:

详解Java多线程与高并发(七)__ThreadLocal_第1张图片

如何理解ThreadLocal:

可以用Java中的Map来帮助我们理解。

当前线程Thread.getCurrendThread()     就相当于是Map中的key

当前线程所要保存的变量   就相当于是Map中的value

保存当前线程的变量:ThreadLocal.set(value)     就相当于用map.put(Thread.getCurrentThread(),  value)

 

使用ThreadLocal要注意的地方:

要注意内存问题:在并发量高的时候,可能会有内存溢出。

这是因为,如下图所示,在并发量很高,繁忙的时候,可能将线程栈中的数据清空,然后重复使用线程,这样的话,线程的id是不变的,因此可能会从ThreadLocal中get出不属于当前线程的数据,因为ThreadLocal在中,在重用线程的过程中,数据不会被清空。

详解Java多线程与高并发(七)__ThreadLocal_第2张图片

如何避免呢?

在使用ThreadLocal的时候,一定要注意资源回收问题,每个线程结束前,将当前线程保存在ThreadLocal的变量删除。即调用ThreadLocal.remove()方法,即可将当前线程保存的变量删除。

你可能感兴趣的:(Java多线程与高并发)