线程安全问题的由来
传统的Web开发是通过实现Servlet对象来进行Http请求的响应。当Web容器收到一个HTTP请求时,Web容器中的一个主调度线程会从事先定义好的线程池中分配一个当前的工作线程,将请求分配给当前的工作线程,由线程来执行对应的Servlet对象的Service方法。因此,对于同一个Servlet对象的多个请求,Servlet的Service方法将在一个多线程的环境中并发执行。即Web容器默认采用单实例(单Servlet实例)多线程的方式来处理Http请求。这样会导致变量访问的线程安全问题。
ThreadLocal实现线程安全的原理
ThreadLocal类在维护变量时,使用了当前线程的一个叫做ThreadLocalMap的独立副本,每个线程可以独立修改属于自己的副本而不会互相影响,从而达到隔离线程的目的,避免线程访问实例变量发生冲突的问题。
Threadlocal本身不是一个线程,是通过操作当前线程中的一个内部变量来达到与其他线程隔离的目的。Thread的类的部分源码如下:
class Thread implements Runnable {
/* ThreadLocal values pertaining to this thread. T