ThreadLocal的用处
在使用hibernate时一定都见过类ThreadLocal,这个类的具体作用是什么,今天研究了一下,有没有问题还请大家拍砖
ThreadLocal主要是针对多线程的问题而设计的,例如在一个java企业程序里,要多个线程来调用到hibernate的session,SessionFactory是线程安全的类,但是Session类并不是线程安全的,如果不对Session进行处理就会有出现多个线程相互调用而引起的混乱。而ThreadLocal的出现为我们解决了这样的一个问题。ThreadLocal会把SessionFactory生成的session存放到他里面的Map里,当有线程需要用到session时,他就会当前调用的线程分配他里面session的一个副本,从保证session本身是不会发生变化的。这样我们就可以把session放到ThreadLocal里,每个线程就只会得到当前session的一个副本,而不会得到session的本身,就是在自己的线程里把session给改变了,也不会影响到ThreadLocal里的session。这样就可以保证session的安全性。
我从百度上找到了下面这样一个程序大家可以对比看一下。
package cn.test;/** *@author whp *@Email whp@ehoo.cn *@May 31, 2011 * */public class SequenceNumber {private static ThreadLocal seqNum = new ThreadLocal(){//创建一个匿名内部类进行初始化@Overrideprotected Object initialValue() {// TODO Auto-generated method stubreturn 0;}};public int getNextNum(){//得到下一个数字seqNum.set(((Integer) seqNum.get())+1); return (Integer)seqNum.get();}public static void main(String[] args) {SequenceNumber sn = new SequenceNumber();TestClinet tc1 = new TestClinet(sn);tc1.start();TestClinet tc2 = new TestClinet(sn);tc2.start();TestClinet tc3 = new TestClinet(sn);tc3.start();}}package cn.test;/** *@author whp *@Email whp@ehoo.cn *@May 31, 2011 * */public class TestClinet extends Thread{private SequenceNumber sn ;public TestClinet(SequenceNumber sn) {this.sn = sn;}@Overridepublic void run() {for(int i=0;i<3;i++){try {Thread.sleep(20);} catch (InterruptedException e) {e.printStackTrace();}System.out.println("【Thread_"+Thread.currentThread().getName()+"】"+sn.getNextNum());//每个线程都会有一个新的sn。}}}在上面的代码中我们可以看到三个线程中session都是新的。结果如下:
【Thread_Thread-1】1
【Thread_Thread-0】1
【Thread_Thread-2】1
【Thread_Thread-1】2
【Thread_Thread-0】2
【Thread_Thread-2】2
【Thread_Thread-0】3
【Thread_Thread-2】3
【Thread_Thread-1】3