本地线程主要是解决多线程中数据因并发产生不一致的问题。ThreadLocal由一个静态的class来存放数据,每个对象都在相似map<threadName,value>的数据结构中加入想要的数据。java
1. Threadlocal:能够看做一个整个线程变量管理类。这个变量能够在本线程使用。安全
2.ThreadLocal是使用一个静态的 Map<Thead.curentName,Object value> 来存放值. 每次存放都是以线程来存放。因此能够作到绝对的线程安全数据结构
3.主要存放 JDBC connection 之类多线程
1. protected Object initialValue():返回该线程局部变量的初始值,该方法是一个protected的方法,显然是为了让子类覆盖而设计的。这个方法是一个延迟调用方法,在线程第1次调用get()或set(Object)时才执行,而且仅执行1次。ThreadLocal中的缺省实现直接返回一个null。并发
2. void set(Object value):设置当前线程的线程局部变量的值。ide
3. public Object get():该方法返回当前线程所对应的线程局部变量。性能
4. public void remove():将当前线程局部变量的值删除,目的是为了减小内存的占用,该方法是JDK 5.0新增的方法。须要指出的是,当线程结束后,对应该线程的局部变量将自动被垃圾回收,因此显式调用该方法清除线程的局部变量并非必须的操做,但它能够加快内存回收的速度。this
1. threadlocal的源码spa
2. 静态方法赋值
线程
1. ThreadLocal使用场合主要解决多线程中数据数据因并发产生不一致问题。ThreadLocal为每一个线程的中并发访问的数据提供一个副本,经过访问副原本运行业务,这样的结果是耗费了内存,单大大减小了线程同步所带来性能消耗,也减小了线程并发控制的复杂度。(空间换时间)
2. ThreadLocal保存的值不能使用原子类型,只能使用Object类型。ThreadLocal的使用比synchronized要简单得多。
3. ThreadLocal和Synchonized都用于解决多线程并发访问。可是ThreadLocal与synchronized有本质的区别。synchronized是利用锁的机制,使变量或代码块在某一时该只能被一个线程访问。而ThreadLocal为每个线程都提供了变量的副本,使得每一个线程在某一时间访问到的并非同一个对象,这样就隔离了多个线程对数据的数据共享。而Synchronized却正好相反,它用于在多个线程间通讯时可以得到数据共享。
4. Synchronized用于线程间的数据共享,而ThreadLocal则用于线程间的数据隔离。
5. 固然ThreadLocal并不能替代synchronized,它们处理不一样的问题域。Synchronized用于实现同步机制,比ThreadLocal更加复杂。
public class MyThreadLocal { // 线程本地线程 public static void main(String[] args) { MyThreadLocal mtl = new MyThreadLocal(); mtl.doMyTest(); } public void doMyTest() { ExecutorService es = Executors.newCachedThreadPool(); for (int i = 0; i < 5; i++) { es.execute(new Test1(i)); } es.shutdown(); } } class Test1 implements Runnable { static ThreadLocal<HashMap<Integer, Integer>> maps = new ThreadLocal<HashMap<Integer, Integer>>() { protected HashMap<Integer, Integer> initialValue() { return new HashMap<Integer, Integer>(); } }; int id; public Test1(int id) { this.id = id; } @Override public void run() { System.out.println(Thread.currentThread().getName() + ": start"); HashMap<Integer, Integer> map = maps.get(); for (int i = 0; i < 10; i++) { map.put(i, id * 100 + i); try { Thread.sleep(100); } catch (Exception e) { } } System.out.println(Thread.currentThread().getName() + ": " + map); } }
理解记忆表