ThreadLocal提供了线程内存储变量的能力,这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。
ThreadLocal和Synchronized都是为了解决多线程中相同变量的访问冲突问题,
不同的点是Synchronized是通过线程等待,牺牲时间来解决访问冲突
ThreadLocal是通过每个线程单独一份存储空间,牺牲空间来解决冲突,
相比于Synchronized,ThreadLocal具有线程隔离的效果,只有在线程内才能获取到对应的值,线程外则不能访问到想要的值。
正因为ThreadLocal的线程隔离特性,使他的应用场景相对来说更为特殊一些。当某些数据是以线程为作用域并且不同线程具有不同的数据副本的时候,就可以考虑采用ThreadLocal。
ThreadLocal多并发测试
//定义一个全局变量
public ThreadLocal
threads = new ThreadLocal
(){ @Override protected ThreadTest initialValue() { return new ThreadTest(); } }; public ThreadLocal
b = new ThreadLocal
(){ @Override protected String initialValue() { return new String(); } }; @Override public ThreadTest setThreadTest(String name,int n) { ThreadTest thread = new ThreadTest(); thread.setName(name); b.set(name); thread.setPwd(b.get()); threads.set(thread); setThread2(name,n); return thread; } public void setThread2(String name,int n){ ThreadTest thread = threads.get(); if(n%2==0){ b.set(name + "---2的倍数---" + n); }else{ b.set(name + "---不是2的倍数---" + n); } thread.setPwd(b.get()); //数据库添加操作 baseTransaction.save(thread); b.remove(); threads.remove(); }