码迷,mamicode.com
首页 > 其他好文 > 详细

ThreadLocal小记

时间:2015-02-02 18:05:19      阅读:108      评论:0      收藏:0      [点我收藏+]

标签:java   线程安全   多线程   

ThreadLocal用于解决单个线程内的数据共享问题,不是线程安全问题的解决方案!!!(多个线程共享的数据才会产生线程安全问题)

ThreadLocal的实现原理大致是:

Thread类中存在一个ThreadLocalMap对象(顾名思义,一个Map,嗯),每次调用ThreadLocal的set、get方法时其实是在间接存取map中的数据,源码:

public void set(T paramT)
  {
    Thread localThread = Thread.currentThread();
    ThreadLocalMap localThreadLocalMap = getMap(localThread);
    if (localThreadLocalMap != null) {
      localThreadLocalMap.set(this, paramT);
    } else {
      createMap(localThread, paramT);
    }
  }
涉及到的getMap方法

ThreadLocalMap getMap(Thread paramThread)
  {
    return paramThread.threadLocals;
  }

值得注意的是,访问权限为默认。同样在Thread中实现的静态ThreadLocalMap类也是默认的访问权限,所以他们仅限包内引用,也决定了ThreadLocal的地位,承担代理角色,使多线程环境透明化。

很重要的get()方法

public T get()
  {
    Thread localThread = Thread.currentThread();
    ThreadLocalMap localThreadLocalMap = getMap(localThread);
    if (localThreadLocalMap != null)
    {
      ThreadLocal.ThreadLocalMap.Entry localEntry = localThreadLocalMap.getEntry(this);
      if (localEntry != null) {
        return localEntry.value;
      }
    }
    return setInitialValue();
  }
以当前ThreadLocal对象作为key,获得当前Thread map中存储的值。

首尾呼应:ThreadLocal用于解决单个线程内的数据共享问题,不是线程安全问题的解决方案!!!(多个线程共享的数据才会产生线程安全问题)

ThreadLocal小记

标签:java   线程安全   多线程   

原文地址:http://blog.csdn.net/leo1024x/article/details/43410867

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!