1.定义
ThreadLocal使用一个Map的形式来为线程提供变量,在同一个线程中能保证变量的唯一性,Map的key为线程id;
ThreadLocal 实例通常是类中的 private static 字段,我们希望将状态与某一个线程相关联。
2.源码分析
get()/set()
public T get() { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) { ThreadLocalMap.Entry e = map.getEntry(this); if (e != null) return (T)e.value; } return setInitialValue(); }
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); }
3.实例
通过模拟浏览器访问服务器时,服务器会为每个浏览器创建一个线程。,如果使用这种机制获取 Session,当同一个用户浏览器无论怎么调用session
都是同一个(在相同的线程中);这种机制就叫做线程单例
package com.ccy.thread.demo; /** * * <p> * Title: ThreadLocalTest.java * Package com.ccy.thread.demo * </p> * <p> * Description: 模拟浏览器访问服务器,同一个浏览器,返回的是同一个session * <p> * @author Tom.Cai * @created 2015-12-29 下午10:30:12 * @version V1.0 * */ public class ThreadLocalTest { public static void main(String[] args) { Session session = SessionFactory.getInstance(); System.out.println(session); System.out.println("----"); printfClass(); } public static void printfClass(){ Session session = SessionFactory.getInstance(); System.out.println(session); } } class Session{ } class SessionFactory{ private static ThreadLocal<Session> tLocal= new ThreadLocal<Session>(); public static Session getInstance(){ Session session = tLocal.get(); if(null == session){ session = new Session(); tLocal.set(session); } return session; } }
更多多线程精彩内容请继续关注我的博客:http://blog.csdn.net/caicongyang
扫描二维码关注公众号,回复:
708437 查看本文章
记录与分享,你我共成长 -from
caicongyang