博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ThreadLocal的认知与见解
阅读量:5046 次
发布时间:2019-06-12

本文共 2633 字,大约阅读时间需要 8 分钟。

ThreadLocal:提高一个线程的局部变量,访问某个线程拥有自己局部变量(很难理解、看看下面这句话,顺便再讲个例子)。

  当使用ThreadLocal维护变量时,ThreadLocal为每一个使用该变量的线程提供独立的变量副本,所以每一个线程都有可以独立第改变自己副本的权力,而不会影响到其他线程所对应的副本。

 

例子:创建三个线程、每个线程产生自己的序列号

1、创建一个产生序列号的类

/** * 定义线程序列号 */class Res{    private int count=0;    public int getCount(){        count = count +1;        return  count;    }}

2、定义线程类

/** * 定义线程类 */class ThreadLocalTest extends Thread{    private Res res;    public ThreadLocalTest(Res res){        this.res = res;    }    @Override    public void run() {        for (int i = 0; i < 3; i++) {            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }            System.out.println(getName()+" : "+i+"------"+res.getCount());        }    }}

3、为实现每个线程都能自己产生自己的序列号我们的主函数会这样写

public static void main(String[] args) {        Res res1 = new Res();        Res res2 = new Res();        Res res3 = new Res();                ThreadLocalTest t1 = new ThreadLocalTest(res1);        ThreadLocalTest t2 = new ThreadLocalTest(res2);        ThreadLocalTest t3 = new ThreadLocalTest(res3);        t1.start();        t2.start();        t3.start();    }

4、对应效果

Thread-1 : 0------1Thread-0 : 0------1Thread-2 : 0------1Thread-2 : 1------2Thread-0 : 1------2Thread-1 : 1------2Thread-1 : 2------3Thread-0 : 2------3Thread-2 : 2------3

注意:我们会看见对于线程Thread-0、Thread-1、Thread-2、会各自加到3(1—3)。但是我们这里创建了3个(麻烦)

   Res res1 = new Res();

        Res res2 = new Res();
        Res res3 = new Res();

处理方法:使用ThreadLocal,就会在自己的空间自己开辟一个内存对于同一个变量。而且对于这个变量互相不影响

1、将产生序列号的类改变

/** * 定义线程序列号 */class Res{    //private int count=0;    /**     * 设置本地局部变量,和其他局部变量分隔开,互不影响     */    private ThreadLocal
count = new ThreadLocal
(){ //设置当前局部变量,初始化值 @Override protected Integer initialValue() { return 0; } }; /*public int getCount(){ count = count +1; return count; }*/ public int getCount(){ int count = this.count.get() + 1; //注意着从新定义了count,别忘了this this.count.set(count); return count; }}

2、同时注意、注意啦,main函数

public static void main(String[] args) {        Res res = new Res();        ThreadLocalTest t1 = new ThreadLocalTest(res);        ThreadLocalTest t2 = new ThreadLocalTest(res);        ThreadLocalTest t3 = new ThreadLocalTest(res);        t1.start();        t2.start();        t3.start();    }

3、对应结果

Thread-0 : 0------1Thread-2 : 0------1Thread-1 : 0------1Thread-1 : 1------2Thread-0 : 1------2Thread-2 : 1------2Thread-2 : 2------3Thread-0 : 2------3Thread-1 : 2------3

 

转载于:https://www.cnblogs.com/karrya/p/10970987.html

你可能感兴趣的文章
Windows Phone开发(24):启动器与选择器之发送短信
查看>>
JS截取字符串常用方法
查看>>
Google非官方的Text To Speech和Speech Recognition的API
查看>>
stdext - A C++ STL Extensions Libary
查看>>
Django 内建 中间件组件
查看>>
bootstrap-Table服务端分页,获取到的数据怎么再页面的表格里显示
查看>>
进程间通信系列 之 socket套接字及其实例
查看>>
天气预报插件
查看>>
Unity 游戏框架搭建 (十三) 无需继承的单例的模板
查看>>
模块与包
查看>>
mysql忘记root密码
查看>>
apache服务器中设置目录不可访问
查看>>
嵌入式Linux驱动学习之路(十)字符设备驱动-my_led
查看>>
【NOIP模拟】密码
查看>>
java容器---------手工实现Linkedlist 链表
查看>>
three.js 性能优化的几种方法
查看>>
《梦断代码》读书笔记(三)
查看>>
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>