ThreadLocal类的简单使用
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类的简单使用的更多相关文章
- 用ThreadLocal类实现线程安全的正确姿势
大家通常知道,ThreadLocal类可以帮助我们实现线程的安全性,这个类能使线程中的某个值与保存值的对象关联起来.ThreadLocal提供了get与set等访问接口或方法,这些方法为每个使用该变量 ...
- 2015年11月26日 Java基础系列(三)ThreadLocal类初级学习
序,ThreadLocal类是为了解决多线程的安全问题.线程安全的意思也就是说每个线程操作自己的变量,不要对其他线程的值造成影响. 在很多情况下,ThreadLocal比直接使用synchronize ...
- ThreadLocal类的实现用法
ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名为Thread ...
- 深入研究java.lang.ThreadLocal类(转)
引用:http://lavasoft.blog.51cto.com/62575/51926/ 一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并 ...
- 深入研究java.lang.ThreadLocal类
一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许 ...
- Java多线程——ThreadLocal类
一.概述 ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是threadlocalvariable(线程局部变量).也许把它命名 ...
- ThreadLocal类分析
首先试想一个场景: 多个线程都要访问数据库,先要获得一个Connection,然后执行一些操作.为了线程安全,如果用synchronized锁定一个Connection对象,那么任何时候,都只有一个线 ...
- ThreadLocal 类 的源码解析以及使用原理
1.原理图说明 首先看这一张图,我们可以看出,每一个Thread类中都存在一个属性 ThreadLocalMap 成员,该成员是一个map数据结构,map中是一个Entry的数组,存在entry实体, ...
- 理解和使用ThreadLocal类
一.从数据结构入手 下图为ThreadLocal的内部结构图 从上面的机构图,可以窥见ThreadLocal的核心机制: 每个Thread线程内部都有一个Map: Map里面存储线程本地对象(key) ...
随机推荐
- odoo KeyError
one2many字段对应的表名不存在造成
- 随机获得id的方法
public String generateUUID() { String uuid = UUID.randomUUID().toString(); uuid = uuid.replace(" ...
- 【每日更新】【Redis学习】
5. Redis订阅和发布模式和Redis事务 -------------------Redis事务------------------- 1.概念: redis中的事务是一组命令的集合.事务 ...
- Quartz.Net进阶之七:QuartzNet其他的功能简述
一.介绍 今天是这个系列的最后一篇文章了,主要功能说的差不多了,我们来看看其他相关的内容.话说回来,虽然是这个系列的最后一篇文章,并不代表Quartz的东西就这么点,学习阶段,就这些了,如果以后有了使 ...
- springmvc webservlet 加redis 订阅消息
由于项目内请求的数据需要 等待设备处理完毕后返回才能得到.请求命令返回的是发送成功的包,而不是设备处理的包,所以需要请求等待.. 方式一:项目中 添加了redis作为一个缓存, webservlet ...
- dskinlite自适应dpi
调试了好久,mfc CDialog终于搞定,付费支持,qq: 80101277 效果图:
- dskinlite(uieasy mfc界面库)使用记录4:listbox测试
先看效果图: xml代码: 作者qq:80101277,dskinlite交流qq群:138231653 <window name="listbox1" type=" ...
- Python-docx 读取word.docx内容
第一次写博客,也不知道要写点儿什么好,所以就把我在学习Python的过程中遇到的问题记录下来,以便之后查看,本人小白,写的不好,如有错误,还请大家批评指正! 中文编码问题总是让人头疼,想要用Pytho ...
- HTML元素的分类
HTML元素的分类 EC前端 - HTML教程 块元素 div:无语义,常用于布局 aside:表示article元素的内容之外的与article元素的内容相关内容 figure:表示一段独立的流内容 ...
- JAVA实训第四次作业
编写"电费管理类"及其测试类. 第一步 编写"电费管理"类 私有属性:上月电表读数.本月电表读数 构造方法:无参.2个参数 成员方法:getXXX()方法.se ...