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.youkuaiyun.com/caicongyang
记录与分享,你我共成长 -from
caicongyang