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) ...
随机推荐
- 20-matlab全排列-函数调用
matlab中global的用法 Matlab 中子函数不传参直接调用主函数global变量方法 在一个m文件里要调用一个函数(自定义的),但是我希望这个函数能利用并修改workspace中的变量( ...
- Java几种常用JSON库性能比较
本篇通过JMH来测试一下Java中几种常见的JSON解析库的性能. 每次都在网上看到别人说什么某某库性能是如何如何的好,碾压其他的库.但是百闻不如一见,只有自己亲手测试过的才是最值得相信的. JSON ...
- Linux驱动之USB鼠标驱动编写
本篇博客分以下几部分讲解 1.介绍USB四大描述 2.介绍USB鼠标驱动程序功能及框架 3.介绍程序用到的结构体 4.介绍程序用到的函数 5.编写程序 6.测试程序 1.介绍USB四大描述符 USB设 ...
- c# maiform父窗体改变动态的gridew 奇偶行变色的快捷方法
无需在每个usercontrol里边单个指定控件内gridview 隔行换色.只需要在主窗体内改成统一就好了 做到这点要明白.gridcontrol 是usercontrol 的子控件 , grid ...
- dskinlite(uieasy mfc界面库)使用记录4:listbox测试
先看效果图: xml代码: 作者qq:80101277,dskinlite交流qq群:138231653 <window name="listbox1" type=" ...
- Vue 中使用 viewerjs进行本地上传预览图片
https://www.cnblogs.com/shenjp/p/9754171.html 如果图片路径是 接口的返回信息的话,将路径存储在数组中,在this.$nextTick中实例化Viewer: ...
- dotNet程序员的Java爬坑之旅(三)之spring MVC篇一
使用maven構建springMVC項目,開發工具為IDEA 一.構建Maven項目,模板為WebApp 二.在pom文件中配置SpringMvc配置(springMvc需要以來servlet ,如本 ...
- Linux内核基本装载卸载
Linux由两部分组成:内核核心+内核模块核心的命名通常是vmlinuz-VERSION-release,模块的放置于/lib/modules/VERSION-release/ 一旦系统运行起来,内核 ...
- AHK控制鼠标与键盘
F4::clicksleep 100MouseGetPos, xpos, ypos x:=xpos+30 click 1877,51sleep 100click 115,51sleep 100clic ...
- AX_xSession
Session xSession = new xSession(); ; xSession.userId();