Java多线程之ThreadLocal

来源:互联网 发布:小黑屋写作软件ios 编辑:程序博客网 时间:2024/04/30 03:26

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

记录与分享,你我共成长 -from caicongyang






1 0