多线程之ThreadLocal类
Synchronized实现内存共享,ThreadLocal为每个线程维护一个本地变量。
采用空间换时间,它用于线程间的数据隔离,为每一个使用该变量的线程提供一个副本,每个线程都可以独立地改变自己的副本,而不会和其他线程的副本冲突。
ThreadLocal类中维护一个Map,用于存储每一个线程的变量副本,Map中元素的键为线程对象,而值为对应线程的变量副本。
ThreadLocal在Spring中发挥着巨大的作用,在管理Request作用域中的Bean、事务管理、任务调度、AOP等模块都出现了它的身影。
Spring中绝大部分Bean都可以声明成Singleton作用域,采用ThreadLocal进行封装,因此有状态的Bean就能够以singleton的方式在多线程中正常工作了。
- /*
- * 学生类
- * 此处为一个bean
- */
- public class Student {
- public int age = 0;
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
主程序:
- import java.util.Random;
- /*
- * 多线程下测试程序
- */
- public class ThreadLocalDemo implements Runnable {
- //创建线程局部变量studentLocal,在后面你会发现用来保存student对象
- private final static ThreadLocal studentLocal = new ThreadLocal();
- public static void main(String[] args) {
- ThreadLocalDemo td = new ThreadLocalDemo();
- //线程一
- Thread t1 = new Thread(td,"a");
- //线程二
- Thread t2 = new Thread(td,"b");
- t1.start();
- t2.start();
- }
- @Override
- public void run() {
- accessStudent();
- // TODO Auto-generated method stub
- }
- /*
- *实例业务方法,用来测试
- */
- public void accessStudent(){
- //获取当前线程的名字
- String currentThreadName = Thread.currentThread().getName();
- System.out.println(currentThreadName + " is running");
- //产生一个随机数并打印
- Random random = new Random();
- int age = random.nextInt(100);
- System.out.println("Tread " + currentThreadName + " set age to:" + age);
- //获取一个student对象,并将随机年龄插入到对象的属性中
- //获取对象的方式,采用本地获取对象
- Student student = getStudent();
- student.setAge(age);
- System.out.println("Thread " + currentThreadName + " 第一次读取年龄为:" + student.getAge());
- try {
- Thread.sleep(5000);
- } catch (InterruptedException ex) {
- ex.printStackTrace();
- // TODO: handle exception
- }
- System.out.println("Thread" + currentThreadName + " 第二次读取年龄为:" + student.getAge());
- }
- //此处为重点
- private Student getStudent() {
- //获取本线程变量并强制转换为Student类型
- Student student= (Student) studentLocal.get();
- //线程首次执行的时候,studentLocal.get()肯定为null
- if(student == null){
- //创建一个Student对象,并保存到本地的线程变量StudentLocal中
- student = new Student();
- studentLocal.set(student);
- }
- // TODO Auto-generated method stub
- return student;
- }
- }
运行结果:
- b is running
- a is running
- Tread b set age to:49
- Tread a set age to:37
- Thread b 第一次读取年龄为:49
- Thread a 第一次读取年龄为:37
- Thread b 第二次读取年龄为:49
- Thread a 第二次读取年龄为:37
可以看到a、b两个线程age在不同时刻打印的值是完全相同的。这个程序通过妙用ThreadLocal,既实现多线程并发,游兼顾数据的安全性
文章出自:http://blog.51cto.com/lavasoft/51926,代码为亲自手撕
多线程之ThreadLocal类的更多相关文章
- Java基础-进程与线程之Thread类详解
Java基础-进程与线程之Thread类详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.进程与线程的区别 简而言之:一个程序运行后至少有一个进程,一个进程中可以包含多个线程 ...
- Java并发编程之ThreadLocal类
ThreadLocal类可以理解为ThreadLocalVariable(线程局部变量),提供了get与set等访问接口或方法,这些方法为每个使用该变量的线程都存有一份独立的副本,因此get总是返回当 ...
- 多线程之ThreadLocal(转)
相信读者在网上也看了很多关于ThreadLocal的资料,很多博客都这样说:ThreadLocal为解决多线程程序的并发问题提供了一种新的思路:ThreadLocal的目的是为了解决多线程访问资源时的 ...
- 多线程之ThreadLocal
Java并发编程:深入剖析ThreadLocal 想必很多朋友对ThreadLocal并不陌生,今天我们就来一起探讨下ThreadLocal的使用方法和实现原理.首先,本文先谈一下对ThreadLoc ...
- Java多线程之ThreadLocal总结2
ThreadLocal是什么 早在JDK 1.2的版本中就提供Java.lang.ThreadLocal,ThreadLocal为解决多线程程序的并发问题提供了一种新的思路.使用这个工具类可以很简洁地 ...
- Java线程之ThreadLocal
翻译:https://www.journaldev.com/1076/java-threadlocal-example?utm_source=website&utm_medium=sideba ...
- Java多线程之ThreadLocal总结
原贴地址:http://www.cnblogs.com/zhengbin/p/5674638.html 阅读目录 官方对ThreadLocal的描述: <Thinking in Java> ...
- java多线程之ThreadLocal
ThreadLocal为每个线程保存变量,以保证数据同步. package Thread.Common; import java.util.Random; import java.util.concu ...
- 多线程之Parallel类
Parallel类是对线程的一个抽象.该类位于System.Threading.Tasks名称空间中,提供了数据和任务并行性. Paraller类定义了数据并行地For和ForEach的静态方法,以及 ...
随机推荐
- 到底什么是哈希Hash?
有次面试被问到这个问题? 我说是经过运算的一串字符串,这个回答显然是让人不满意,连自己都不满意! 但是又对其很模糊,那么到底什么是Hash呢? 定义 Hash一般翻译为散列,还有音译为哈希,本文我们统 ...
- LeetCode-P53题解【动态规划】
本文为原创,转载请注明:http://www.cnblogs.com/kylewilson/ 题目出处: https://leetcode.com/problems/maximum-subarray/ ...
- VBA调用数独求解器
我开发了一个用于求解数独的dll文件,只需要双击一下注册表文件,就可以在VBA中调用这个功能了.具体步骤如下: 下载:https://share.weiyun.com/5dpcNqx 找到ExcelS ...
- HTML基础复习1
网页:HTML(超文本标记语言) 网页分为静态网页和动态网页,区别:动态网页中可以加入脚本代码,还可以动态的引入数据库中的信息. HTML的结构 <html> <head>头信 ...
- 《UML与设计原则》--第四小组
关于设计模式与原则 一.设计模式简介 设计模式描述了软件设计过程中某一类常见问题的一般性的解决方案.而面向对象设计模式描述了面向对象设计过程中特定场景下.类与相互通信的对象之间常见的组织关系. 二.G ...
- SpringBoot配置文件基础部分说明
SpringBoot-yml文件配置说明 友情提示:有一些代码中有乱码,请脑补删除,适合快速入门 #开启spring的Bebug模式,可以查看有哪些自动配置生效 #debug=true #开启热启动, ...
- Hash Join: Basic Steps
Joins https://docs.oracle.com/database/121/TGSQL/tgsql_join.htm#TGSQL242 tidb/index_lookup_hash_join ...
- 数据库内核——基于HLC的分布式事务实现深度剖析
DTCC 2019 | 深度解码阿里数据库实现 数据库内核--基于HLC的分布式事务实现深度剖析-阿里云开发者社区 https://developer.aliyun.com/article/70355 ...
- Update Node Using a Package Manager nodesource
How to Update Node.js to Latest Version (Linux, Ubuntu, OSX, Others) - HostingAdvice.com https://www ...
- git commit前检测husky与pre-commit 提交钩子
git commit前检测husky与pre-commit git commit前检测husky与pre-commit - 简书 https://www.jianshu.com/p/f0d31f92b ...