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

扫描二维码关注公众号,回复: 708437 查看本文章
记录与分享,你我共成长 -from caicongyang
 




猜你喜欢

转载自xianlincai.iteye.com/blog/2367929