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. Python播放、关闭音乐代码

    1.安装pygame:win + r :打开控制台输入:pip install pygame 2.#导入 import time import pygame 3.设置音乐绝对路径 #音乐路径 file ...

  2. Tigase8.0 源代码分析:一、启动篇

    Tigase8.0 引用了IoC(控制反转)和DI(依赖注入) 等技术手段,来对对象的创建和控制.不懂的百度下就知道了,Spring完美的实现IOC ,贴一段解释: 通俗地说:控制反转IoC(Inve ...

  3. 炫酷MD风之dialog各种对话框

    这个demo也是我从别人那里学来的,不是本人写的代码,我也是个MD初学者.把这个demo分享给看到的你,希望对你有帮助. 直接上图: demo地址:百度网盘:链接:https://pan.baidu. ...

  4. HTML5-盒子的使用

    一. border-color border-width border-style 属性用法遵循顺时针顺序. border-top- border-left- border-bottom- borde ...

  5. Django ORM 常用字段和参数

    Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...

  6. Sum of Subsequence Widths LT891

    Given an array of integers A, consider all non-empty subsequences of A. For any sequence S, let the  ...

  7. Finance API文档

    0. 公共部分 请求url {apiRoot}/{method}?ver={version}&appkey={appkey}&sign={sign} 参数名 说明 示例 apiRoot ...

  8. java添加菜单项目

  9. 解决 ERROR: missing Change-Id in commit message footer 问题

    提交代码操作 git push origin HEAD:refs/for/XXX,提示失败ERROR: missing Change-Id in commit message footer,丢失Cha ...

  10. Chapter4_控制执行流程

    总结java中所有的与流程控制有关的知识 (1)表达式判断 Java中只允许true或者false来作为判断条件,不允许用0或者非0值作为判断条件. (2)if-else 与流程密切相关的语句,决定了 ...