文档章节

对ThreadLocal的思考

埔枘
 埔枘
发布于 2017/08/17 16:01
字数 493
阅读 19
收藏 0

    ThreadLocal 直译过来是 '本地线程',这个理解是不正确的。来看一个案例。

  1.0 案例

    先是一个接口

public interface Sequence {
    int getNumber();
}

实现类

public class SequenceA implements Sequence{
    static int i = 0;
    public int getNumber() {
       return i++;
    }

    public static void main(String[] args){
        SequenceA sequenceA = new SequenceA();
        new MyThread(sequenceA).start();
        new MyThread(sequenceA).start();
        new MyThread(sequenceA).start();
    }
}

//线程类

public class MyThread extends Thread {
    private Sequence sequence;

    public MyThread(Sequence sequence){
        this.sequence = sequence;
    }

    public void run() {
        for(int i=0;i<4;i++){
            System.out.println(Thread.currentThread().getName()+"--"+sequence.getNumber());
        }
    }
}

运行结果
Thread-0--0
Thread-0--1
Thread-0--2
Thread-0--3
Thread-1--4
Thread-1--5
Thread-1--6
Thread-1--7
Thread-2--8
Thread-2--9
Thread-2--10
Thread-2--11

Process finished with exit code 0
 

因为 

static int i = 0;

是静态的  是所有线程所共享的,所以会出现以上结果,那么我希望每个线程都有独立的  i  呢? 

这时候ThreadLocal 派上用场了,

稍微改造了一下

public class SequenceA implements Sequence{

    private static ThreadLocal<Integer> contaner = new ThreadLocal<Integer>(){
        @Override
        protected Integer initialValue() {
            return 0;
        }
    };

    public int getNumber(){
        contaner.set(contaner.get()+1);
        return contaner.get();
    }


    public static void main(String[] args){
        SequenceA sequenceA = new SequenceA();
        new MyThread(sequenceA).start();
        new MyThread(sequenceA).start();
        new MyThread(sequenceA).start();
    }
}

输出结果:

Thread-0--1
Thread-0--2
Thread-0--3
Thread-0--4
Thread-1--1
Thread-1--2
Thread-1--3
Thread-1--4
Thread-2--1
Thread-2--2
Thread-2--3
Thread-2--4

 

这才是我要的结果嘛,可是为什么 明明是 static的变量 却 每个线程都有了一份,,其实ThreadLocal其实相当于一个容器,它为每个线程 保存了 一个副本

那么 我们有必要来了解下ThreadLocal是怎么实现的  还有为什么我们要实现 

它的   initialValue   方法
protected T initialValue() {
    return null;
}

这是它的源码   方式是protected 那么 它就是提示我们去 现实它,

以下是它的源码 可以看出来 它里面封装了 一个Map 容器 来实现 

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();
}

有兴趣可以看看它的源码

 

© 著作权归作者所有

埔枘
粉丝 1
博文 24
码字总数 8223
作品 0
怀化
程序员
私信 提问
[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱?

[Java学习探讨]为什么学Java虚拟机的Java程序员更值钱? 曾经的我经常害怕处理与JVM相关的异常,对JVM的配置参数也一无所知,那时候我天真地认为,JVM的出现本身就是想让程序员屏蔽实现细节,...

原创小博客
2018/07/19
0
0
手撕面试题ThreadLocal!!!

说明 面试官:讲讲你对ThreadLocal的一些理解。 那么我们该怎么回答呢????你也可以思考下,下面看看零度的思考; ThreadLocal用在什么地方? ThreadLocal一些细节! ThreadLocal的最佳实...

匠心零度
06/19
0
0
[北京]搜狐高薪招聘JS前端/页面制作/Java架构/开发/运维/搜索

北京搜狐为了构建一个重要的互联网产品, 打造一支精英化队伍, 特招聘有理想有抱负 的同学, 来实现我们共同的理想! 你是否胸中理想? 你是否需要一个大的舞台? 你是否需要一帮聊得来的兄弟, 请...

飞云小侠
2011/07/11
1K
11
搜狐(北京) 高薪招聘 Java 项目经理/架构师/WEB开发工程师

北京搜狐 高薪招聘 Java 项目经理/架构师/WEB开发工程师 有意请联系我 或帮忙转发 联系方式 cnscud@gmail.com msn:cloud@cnscud.com 多谢支持 注明来自 oschina.net更好, 谢谢 薪水范围 10-2...

飞云小侠
2011/05/08
816
7
[北京] 搜狐招聘Java技术Leader, 架构师, 资深工程师

搜狐公司, www.sohu.com 具体邮件联系 felixzhang@sohu-inc.com 咨询 msn: cloud@cnscud.com 常规薪水范围 10K-30K 牛人上不封顶 --------------------------------------- · Java项目经理 ......

飞云小侠
2012/02/02
1K
7

没有更多内容

加载失败,请刷新页面

加载更多

NIO基于长度域的报文在Netty下的解码

1, 先复习一下粘包/拆包 1.1, 粘包/拆包的含义 TCP是个“流”协议, 并不了解上层业务数据的具体含义, 它会根据TCP缓冲区的实际情况进行包的划分,所以在业务上认为,一个完整的包可能会被TCP...

老菜鸟0217
今天
8
0
从零开始搭建spring-cloud(2) ----ribbon

在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的。Spring cloud有两种服务调用方式,一种是ribbon+restTemplate,另一种是feign。 其实我们已经在上...

Vincent-Duan
今天
17
0
get和post的区别?

doGet:路径传参。效率高,安全性差(get的传送数据量有限制,不能大于2Kb) doPOST:实体传参。效率低,安全性好 建议: 1、get方式的安全性较Post方式要差些,包含机密信息的话,建议用Pos...

花无谢
昨天
4
0
当谈论迭代器时,我谈些什么?

当谈论迭代器时,我谈些什么? 花下猫语:之前说过,我对于编程语言跟其它学科的融合非常感兴趣,但我还说漏了一点,就是我对于 Python 跟其它编程语言的对比学习,也很感兴趣。所以,我一直...

豌豆花下猫
昨天
14
0
10天学Python直接做项目,我做了这5件事

初学者如何尽快上手python? 市面上关于如何学python的资料很多,但是讲的都太复杂。 我就是很简单的几句话,从小白到开发工程师,我只做了五件事。 我觉得任何商业计划书如果不能用几句话讲...

Python派森
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部