标签: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