文档章节

ThreadLocal的研究

暗中观察
 暗中观察
发布于 06/19 09:18
字数 274
阅读 7
收藏 0

首先看下它的数据结构

ThreadLocal.ThreadLocalMap 是thread 的一个成员变量,它的生命周期和thread是相同的

我们不妨看下我们最常用的ThreadLocal#get方法

  public T get() {
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null) {
            ThreadLocalMap.Entry e = map.getEntry(this);
            if (e != null) {
                @SuppressWarnings("unchecked")
                T result = (T)e.value;
                return result;
            }
        }
        return setInitialValue();
    }

重点看下setInitialValue方法,作用就是给thread的ThreadLocalMap赋值,ThreadLocalMap存在就用原来的,否则就创建一个新的并给thread的threadLocals成员变量

    private T setInitialValue() {
        T value = initialValue();
        Thread t = Thread.currentThread();
        ThreadLocalMap map = getMap(t);
        if (map != null)
            map.set(this, value);
        else
            createMap(t, value);
        return value;
    }

 void createMap(Thread t, T firstValue) {
        t.threadLocals = new ThreadLocalMap(this, firstValue);
    }

所以一般我们会这么使用ThreadLocal

import java.text.ParseException;
import java.util.Date;
import java.text.SimpleDateFormat;

public class DateUtil {
    private static ThreadLocal<SimpleDateFormat> local=new ThreadLocal<SimpleDateFormat>(){
        @Override
        protected SimpleDateFormat initialValue() {
            return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        }
    };

    public static Date parse(String str){
        try {
          return local.get().parse(str);
        } catch (ParseException e) {
            e.printStackTrace();
        }finally {
            local.remove();
        }
        return null;
    }
}

 

© 著作权归作者所有

下一篇: 桶排序
暗中观察

暗中观察

粉丝 7
博文 128
码字总数 45846
作品 0
惠州
私信 提问
从程序员走向java架构师的书籍推荐!

作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从。我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想...

欧阳海阳
2018/07/16
0
0
学java,必须要会什么?

学java一年了,感觉越学越局限了,想着必须精通个什么。。。说是精通java,精通java的什么呢? 面向对象啊。。。 ssh啊、。。。 感觉学的太肤浅了。。。 总觉得应该朝着哪方面研究研究?努力...

星华
2016/09/09
963
10
毕业题目选择的纠结

在毕业题目的选择很纠结,大家来给给意见 第一种是软件系统设计,我之前一段时间的学习主要都是java相关、web相关的东西,这类毕业题目可能是做一些基于框架的管理网站、app之类的东西。这类...

银古
2013/09/06
400
6
用大白话告诉你啥是Java开发

Java,是由Sun Microsystems公司于1995年5月推出的Java程序设计语言和Java平台的总称。用Java实现的HotJava浏览器(支持Java applet)显示了Java的魅力:跨平台、动态的Web、Internet计算。从此...

远方Java
2018/06/14
0
0
这样的,求带走

现在研二上学期, 三年制,想寻求一份java后端开发的工作 有过将近两年在公司实习的经历 研究方向是分布式系统,soa服务化框架,有过开发服务集成平台的经历 java方面基本的语法之类的就不说了...

bii
2014/12/05
966
7

没有更多内容

加载失败,请刷新页面

加载更多

Navicat 快捷键

操作 结果 ctrl+q 打开查询窗口 ctrl+/ 注释sql语句 ctrl+shift +/ 解除注释 ctrl+r 运行查询窗口的sql语句 ctrl+shift+r 只运行选中的sql语句 F6 打开一个mysql命令行窗口 ctrl+l 删除一行 ...

低至一折起
今天
6
0
PyTorch入门笔记一

张量 引入pytorch,生成一个随机的5x3张量 >>> from __future__ import print_function>>> import torch>>> x = torch.rand(5, 3)>>> print(x)tensor([[0.5555, 0.7301, 0.5655],......

仪山湖
今天
5
0
OSChina 周二乱弹 —— 开发语言和语言开发的能一样么

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @花间小酌:#今日歌曲推荐# 分享The Score的单曲《Revolution》 《Revolution》- The Score 手机党少年们想听歌,请使劲儿戳(这里) @批判派...

小小编辑
今天
2.6K
19
oracle ORA-39700: database must be opened with UPGRADE option

ORA-01092: ORACLE instance terminated. Disconnection forced ORA-00704: bootstrap process failure ORA-39700: database must be opened with UPGRADE option 进程 ID: 3650 会话 ID: 29......

Tank_shu
今天
3
0
分布式协调服务zookeeper

ps.本文为《从Paxos到Zookeeper 分布式一致性原理与实践》笔记之一 ZooKeeper ZooKeeper曾是Apache Hadoop的一个子项目,是一个典型的分布式数据一致性的解决方案,分布式应用程序可以基于它...

ls_cherish
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部