您的位置:首页 > 编程语言 > Java开发

Java多线程之ThreadLocal

2015-12-29 22:32 459 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: