现在的位置: 首页 > 综合 > 正文

学习ThreadLocal

2018年05月22日 ⁄ 综合 ⁄ 共 1236字 ⁄ 字号 评论关闭

今天学习acegi时说SecurityContextHolder uses a ThreadLocal,在SecurityContextHolder类的initialize方法中,会根据strategyName的不同NEW一个对象,如:  strategy = new ();ThreadLocalSecurityContextHolderStrategy

在执行getContext()时,会调用strategy的getContext()方法,在ThreadLocalSecurityContextHolderStrategy中,有:

    private static ThreadLocal contextHolder = new ThreadLocal();

    public void clearContext() {
        contextHolder.set(
null);
    }

    public SecurityContext getContext() {
        
if (contextHolder.get() == null) {
            contextHolder.set(
new SecurityContextImpl());
        }

        return (SecurityContext) contextHolder.get();
    }

    public void setContext(SecurityContext context) {
        Assert.notNull(context, 
"Only non-null SecurityContext instances are permitted");
        contextHolder.set(context);
    }

其中用到了ThreadLocal,之前就对此类不太了解,所以查了一些资料:

参见:

1,ThreadLocal与synchronized http://www.javaeye.com/topic/81936

2,ThreadLocal的几种误区http://www.blogjava.net/jspark/archive/2006/08/01/61165.html

3,ThreadLocal简要介绍http://myrss.easyjf.com/html/20070317/2950332416031572.htm

一直有一个疑问,就是每个ThreadLocal对每个线程似乎只能维持一个值,那么如果acegi和hibernate都用到ThreadLocal时,并且在同一个线程,这个值不是就要被重写吗?

现在的理解是,acegi和hibernate创建的是两个ThreadLocal对象,所以即使在同一线程,key值相同,值也会不同.就像建立了两个map对象一样,每个map对象中相同的key的value可以不同.

【上篇】
【下篇】

抱歉!评论已关闭.