1.概述
变量值的共享可以使用public 是static 变量的形式,所有的线程都使用同一个public static 变量。 如实现线程内的共享变量,jdk提供了ThreadLocal来解决这个问题。

ThreadLocal主要解决就是每个线程绑定自己的值,可以将ThreadLocal类看成全局存放数据的盒子。
2.基本使用

基本demo演示(存取值)

/**
* @author 上海尚学堂 shsxt.com
* 了解更多 加V:java8733
*/
public class ThreadLocalDemo01 { public static ThreadLocal t1 = new ThreadLocal(); public static void main(String[] args) { if (t1.get() == null) {
System.out.println("从未放过值");
t1.set("存放的值");
} System.out.println(t1.get());
System.out.println(t1.get()); }
}

  

结果示例:
从未放过值
存放的值
存放的值

结果分析:
从第一次调用t1.get()方法时候,返会的null.然后通过set() 方法赋值后顺利取出值。
类ThreadLocal解决的是变量在不同线程间的隔离性。也就是不同线程拥有自己的值。不同线程中的值是可以放入ThreadLocal类中进行保存。

3.隔离性
验证线程变量的隔离性:

package com.threadlocal;
/**
* 验证隔离性
* @author 上海尚学堂 shsxt.com
*
*/
public class ThreadLocalDemo02 { public static ThreadLocal demo = new ThreadLocal(); public static void main(String[] args) { ThreadA a = new ThreadA();
a.start(); ThreadB b = new ThreadB();
b.start();
try {
for (int i = 0; i < 100; i++) {
demo.set("Main .." + (i + 1));
System.out.println("Main getValue ..." + demo.get()); Thread.sleep(200);
} } catch (InterruptedException e) {
e.printStackTrace();
} } } class ThreadA extends Thread { @Override
public void run() {
try {
for (int i = 0; i < 100; i++) { ThreadLocalDemo02.demo.set("ThreadA" + (i + 1));
System.out.println("ThreadA getValue " + ThreadLocalDemo02.demo.get());
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
} } class ThreadB extends Thread { @Override
public void run() {
try {
for (int i = 0; i < 100; i++) { ThreadLocalDemo02.demo.set("ThreadA" + (i + 1));
System.out.println("ThreadA getValue " + ThreadLocalDemo02.demo.get());
Thread.sleep(200);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
super.run();
} }

  

执行结果

小结:
从上面执行的结果可以看的出来,每一个线程向ThreadLocal 中存值时,但是每个线程取出的都是自己线程的值。这也就验证的线程变量的隔离性。
上海尚学堂Java教研组原创,转载请注明出处!感谢阅读上海尚学堂Java技术文章。请多关注收藏!

ThreadLocal类的简单使用的更多相关文章

  1. 用ThreadLocal类实现线程安全的正确姿势

    大家通常知道,ThreadLocal类可以帮助我们实现线程的安全性,这个类能使线程中的某个值与保存值的对象关联起来.ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量 ...

  2. 2015年11月26日 Java基础系列(三)ThreadLocal类初级学习

    序,ThreadLocal类是为了解决多线程的安全问题.线程安全的意思也就是说每个线程操作自己的变量,不要对其他线程的值造成影响. 在很多情况下,ThreadLocal比直接使用synchronize ...

  3. ThreadLocal类的实现用法

    ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为Thread ...

  4. 深入研究java.lang.ThreadLocal类(转)

    引用:http://lavasoft.blog.51cto.com/62575/51926/ 一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并 ...

  5. 深入研究java.lang.ThreadLocal类

        一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许 ...

  6. Java多线程——ThreadLocal类

    一.概述   ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...

  7. ThreadLocal类分析

    首先试想一个场景: 多个线程都要访问数据库,先要获得一个Connection,然后执行一些操作.为了线程安全,如果用synchronized锁定一个Connection对象,那么任何时候,都只有一个线 ...

  8. ThreadLocal 类 的源码解析以及使用原理

    1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体, ...

  9. 理解和使用ThreadLocal类

    一.从数据结构入手 下图为ThreadLocal的内部结构图 从上面的机构图,可以窥见ThreadLocal的核心机制: 每个Thread线程内部都有一个Map: Map里面存储线程本地对象(key) ...

随机推荐

  1. odoo KeyError

    one2many字段对应的表名不存在造成

  2. 随机获得id的方法

    public String generateUUID() { String uuid = UUID.randomUUID().toString(); uuid = uuid.replace(" ...

  3. 【每日更新】【Redis学习】

    5. Redis订阅和发布模式和Redis事务 -------------------Redis事务------------------- 1.概念:     redis中的事务是一组命令的集合.事务 ...

  4. Quartz.Net进阶之七:QuartzNet其他的功能简述

    一.介绍 今天是这个系列的最后一篇文章了,主要功能说的差不多了,我们来看看其他相关的内容.话说回来,虽然是这个系列的最后一篇文章,并不代表Quartz的东西就这么点,学习阶段,就这些了,如果以后有了使 ...

  5. springmvc webservlet 加redis 订阅消息

    由于项目内请求的数据需要 等待设备处理完毕后返回才能得到.请求命令返回的是发送成功的包,而不是设备处理的包,所以需要请求等待.. 方式一:项目中 添加了redis作为一个缓存, webservlet ...

  6. dskinlite自适应dpi

    调试了好久,mfc CDialog终于搞定,付费支持,qq: 80101277 效果图:

  7. dskinlite(uieasy mfc界面库)使用记录4:listbox测试

    先看效果图: xml代码: 作者qq:80101277,dskinlite交流qq群:138231653 <window name="listbox1" type=" ...

  8. Python-docx 读取word.docx内容

    第一次写博客,也不知道要写点儿什么好,所以就把我在学习Python的过程中遇到的问题记录下来,以便之后查看,本人小白,写的不好,如有错误,还请大家批评指正! 中文编码问题总是让人头疼,想要用Pytho ...

  9. HTML元素的分类

    HTML元素的分类 EC前端 - HTML教程 块元素 div:无语义,常用于布局 aside:表示article元素的内容之外的与article元素的内容相关内容 figure:表示一段独立的流内容 ...

  10. JAVA实训第四次作业

    编写"电费管理类"及其测试类. 第一步 编写"电费管理"类 私有属性:上月电表读数.本月电表读数 构造方法:无参.2个参数 成员方法:getXXX()方法.se ...