ThreadLocal中文名叫线程局部变量,意思是该变量对其他线程而言是隔离的,也就是说该变量是当前线程独有的变量。这是因为:ThreadLocal为变量在每个线程中都创建了一个副本,所以每个线程都是在访问自己内部的这个副本变量。
ThreadLocal变量,同一个ThreadLocal所包含的对象(被ThreadLocal所修饰的变量),在不同的Thread中有不同的副本。
注意:
1.每个Thread内都有自己的实例副本,且该副本只能由当前Thread使用。
2.不存在多线程共享问题。因为每个线程都有自己的实例副本,且其它线程是不能访问的。
ThreadLocal提供了线程本地的实例,它与普通变量的区别在于:每个使用该变量的线程都会初始化一个完全独立的实例副本。当一个线程结束时,它所使用的所有ThreadLocal相对应的实例副本都可以被回收。
ThreadLocal适用场景:ThreadLocal适用于每个线程需要自己独立的实例且该实例需要在多个方法中被使用,也即变量在线程间隔离而在方法或类间共享的场景。
两者都是用于解决多线程并发访问问题。
区别:
1、Synchronized用于实现线程间的数据共享,而ThreadLocal则用于实现线程间的数据隔离。
2、Synchronized是利用锁的机制,使变量或代码块中同一时刻只能被一个线程访问。而ThreadLocal为每一个线程都提供了变量的副本,使得每个线程在某一时刻访问到的并不是同一个对象,这样就隔离了多个线程对数据的数据共享。