Synchronized是为了让多线程进行数据共享,而ThreadLocal为了让多线程进行数据隔离。
ThreadLocal为变量在每个线程中都创建了一个副本,那么每个线程可以访问自己内部的副本变量。
个人理解:同一个变量,每个线程都复制一份放到自己家里,当需要对这个变量进行操作的时候就操作自己家的变量。每个线程都操作自己家的,所以互不影响。
public class ConnThreadLocal {
public static ThreadLocal<String> th = new ThreadLocal<String>();
public void setTh(String value){
th.set(value);
}
public void getTh() {
System.out.println(Thread.currentThread().getName()+":"+this.th.get());
}
public static void main(String[] args) throws InterruptedException{
final ConnThreadLocal ct = new ConnThreadLocal();
Thread t1 = new Thread(new Runnable() {
@Override
public void run() {
ct.setTh("张三");
ct.getTh();
}
},"t1");
Thread t2 = new Thread(new Runnable() {
@Override
public void run() {
ct.setTh("李四");
ct.getTh();
}
},"t2");
t1.start();
t2.start();
}
}
运行结果:
本例中,两个线程都对ct对象进行set操作,但结果互不影响,就是因为ConnThreadLocal 类中th 是ThreadLocal类的对象,两个线程的数据是隔离的,所以会输出各自的结果,互不干扰。