读书人

对TheadLocal的了解和使用

发布时间: 2012-12-23 11:28:15 作者: rapoo

对TheadLocal的理解和使用

这两天对ThreadLocal了解了下,通过google,很多文章都多是同一个说法,ThreadLocal为每个使用该变量的线程提供独立的变量副本,刚开始的时候就是这样理解的:假如说线程A和线程B共享变量c,那么通过ThreadLocal呢,我们就可以通过使用ThreaLocal这个类来使线程A和线程B各自拥有贡献变量c的副本,这样就不用锁了,就可以线程安全了,嘿嘿 ,性能和安全双收。恩,觉得这思想so good,那我就来写个小例子吧。

?? 代码如下:

?? 先是共享变量c的代码:

??接着test类

?结果运行结果是

?和之前没有什么区别,就是多了个ThreadLocal静态变量

在看测试类

?? 这次run方法就是调用了getStudent方法。直接去取,取不到就new个放进去,

这次的运行结果

    private Entry getEntry(ThreadLocal key) {            int i = key.threadLocalHashCode & (table.length - 1);            Entry e = table[i];            if (e != null && e.get() == key)                return e;            else                return getEntryAfterMiss(key, i, e);        }

set方法和get方法类似。就不说了

在从例子方面说,

??每次都是先去取,取不到的时候就new一个让后在放进去。这个和共享变量好像根本没什么关系,

这东西感觉和web的session很像,一个个线程就像是一个个会话,一个会话共享一个session,而一个线程通过一个ThreadLocal的set方法放个对象的引用进去,那么在这个线程的任何时刻都可以同过这个ThreadLocal去得到set进去的对象的引用。

结论:ThreadLocal并没有解决共享变量的问题,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,是在自己线程中产生的,其他线程是不需要访问的,也访问不到的。只不过,通过ThreadLocal的set的对象,在这个线程的任意时刻都是可以通过set的那个ThreadLocal的get获得set进去的对象的引用,和web的session有点类似。特别的,要是set进去的对象是共享变量,那还是会有并发的错误。

?

使用的情况:对每一个线程都必须持有一个类的实例,而且这个类是可变的(不可变的就是线程安全的,全部线程使用一个就可以了),例如hibernate对session的处理。

读书人网 >编程

热点推荐