Java多线程之ThreadLocal

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

 

 

 




 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值