标签: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(); } } }
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
原文地址:http://blog.csdn.net/a403071690/article/details/47397439