码迷,mamicode.com
首页 > 其他好文 > 详细

ThreadLocal入门讲解

时间:2015-08-10 14:55:01      阅读:83      评论:0      收藏:0      [点我收藏+]

标签:threadlocal

当然,我之前看了不少关于threadlocal的文章,我发现都是哪一个版本,而且写的初学者看不懂,我只能自己写点例子,学习一下,并记录下来。

我之所以说入门,是因为我都用通俗的语言去描述,并非官方的标准翻译。

OK!

ThreadLocal 翻译过来叫:线程本地变量。

那其实他就是个变量嘛,比如String str = "abc";//这个str就是一个变量。

那么str和ThreadLocal区别是什么呢?

str只能存字符串型,而ThreadLocal可以存对象。他是泛型:ThreadLocal<T>,(别问我泛型是什么,好,我告诉你,泛型就是什么都能存。)

ThreadLocal有两个方法:set(<T>t) 和get

set可以设置一个值,get可以获取这个值,泛型的。

例如:

 

public void tet()
	{
		ThreadLocal<String> tl = new ThreadLocal<String>();
		tl.set("haha");
		System.out.println(tl.get());//运行打印为:haha
		
	}


重点他是线程不共享的!这句话不好理解,需要用到一个例子。


public class Demo1 extends Thread {

	public static ThreadLocal<String> tl = new ThreadLocal<String>();// 线程本地变量tl
	public static String str = "";// 普通变量str

	public static void main(String[] args) {

		Demo1 m = new Demo1();// 线程1
		Demo1 m2 = new Demo1();// 线程2
		//线程开始就会调用run方法,当运行到sleep(1000)时候,就会停止1秒,这个时候线程2就开始运行了。
		m.start();// 开始线程1
					
		m2.start();// 开始线程2
	}

	public void run() {
		try {
			/*
			 * 把线程名赋值给str,线程1走到这,赋值为Thread-0|线程2运行到这,str=hread-1
			 * ,线程2的名字会把线程1的名字给覆盖了。所以打印都是线程2的名字,但是tl就不会覆盖
			 */
			str = this.getName();
			/*
			 * 把线程名赋值给tl,线程1走到这,赋值为Thread-0
			 * |线程2运行到这,注意,不一样的地方来了,tl=hread-1,但是看打印信息。你会发现有什么不一样。
			 */
			tl.set(this.getName());
			/*
			 * 线程睡觉1秒,那么第二个线程就偷偷run了,线程1到这停下了1秒,然后线程2开始走到这,然后线程1往下运行,然后线程2往下运行。
			 */
			this.sleep(1000);
			//
			System.out.println("str:" + str);
			System.out.println("name:" + tl.get());

			// 运行打印结果:<str的被覆盖了,tl却没有被覆盖,说明了线程不共享,而是线程单独使用的变量>
			// str:Thread-1
			// str:Thread-1
			// name:Thread-1
			// name:Thread-0

		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}



那么典型的例子就是hibernate中典型的ThreadLocal的应用

    private static final ThreadLocal threadSession = new ThreadLocal();

    public static Session getSession() throws InfrastructureException {
        Session s = (Session) threadSession.get();
        try {
            if (s == null) {
                s = getSessionFactory().openSession();
                threadSession.set(s);
            }
        } catch (HibernateException ex) {
            throw new InfrastructureException(ex);
        }
        return s;
    }

实现原理:其实ThreadLocal内部是一个Map<key,T>,所以他才可以存多个值,却不会覆盖。当然,我这里说的只是入门了解,并非深入,如果想继续深入了解,那可能就需要看他的源码。当然,源码是很长,我就不粘了。

版权声明:本文为博主原创文章,未经博主允许不得转载。

ThreadLocal入门讲解

标签:threadlocal

原文地址:http://blog.csdn.net/a403071690/article/details/47397439

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!