java多线程之ThreadLoal详解

一、ThreadLocal简介

多线程访问同一个共享变量时特别容易出现并发问题,特别是在多个线程需要对一个共享变量进行写入时。为了保证线程安全,一般使用者在访问共享变量时需要进行适当的同步

同步一般是通过加锁来实现的,但这对用户有一定要求,加重了使用者的负担.使用ThredLocal就可以做到,创建一个变量后,每个线程对其访问的时候访问的是自己创建的变量.

如果你创建了一个ThreadLocal变量,那么访问这个变量的每个线程都会拥有一个这个变量的副本.操作的时候也是操作的属于自己这个线程的变量,从而避免了线程安全问题.

在这里插入图片描述
二、ThreadLocal使用示例

package ThreadLocalTest;public class ThreadLocalTest {static void print(String str) {//1.1 打印当前线程本地内存中localVariable变量的值System.out.println(str + ":" + localVariable.get());//清除当前线程本地内存中的localVariable的值//localVariable.remove();}//    创建ThreadLocal变量static ThreadLocal<String> localVariable = new ThreadLocal<String>();//    创建线程onepublic static void main(String[] args) {Thread threadOne = new Thread(new Runnable() {@Overridepublic void run() {
//                设置线程One中本地变量loalVariable的值localVariable.set("threadOne local variable");
//                调用打印函数print("threadOne");
//                打印本地变量值System.out.println("threadOne remove after" + ":" + localVariable.get());}});
//        创建线程twoThread threadTwo = new Thread(new Runnable() {@Overridepublic void run() {
//                设置线程Two中本地变量loalVariable的值localVariable.set("threadTwo local variable");
//                调用打印函数print("threadTwo");
//                打印本地变量值System.out.println("threadTwo remove after" + ":" + localVariable.get());}});
//        启动线程threadOne.start();threadTwo.start();}
}

运行结果如下

threadOne:threadOne local variable
threadOne remove after:threadOne local variable
threadTwo:threadTwo local variable
threadTwo remove after:threadTwo local variable

线程One中的代码3.1通过set方法设置了localVariable的值,这其实设置的是线程One本地内存中的一个副本,这个副本线程Two是访问不了的。然后代码3.2调用了print函数,代码1.1通过get函数获取了当前线程(线程One)本地内存中localVariable的值。

线程Two的执行类似于线程One。

将localVariable.remove 这一句代码的注释删除

static void print(String str) {//1.1 打印当前线程本地内存中localVariable变量的值System.out.println(str + ":" + localVariable.get());//清除当前线程本地内存中的localVariable的值//localVariable.remove();}

运行结果如下所示:

threadOne:threadOne local variable
threadOne remove after:null
threadTwo:threadTwo local variable
threadTwo remove after:null

三、ThreadLocal实现原理

首先看一下ThreadLocal相关类的类图结构
在这里插入图片描述
由该图可知,Thread类中有一个threadLocals和一个inheritableThreadLocals,它们都是ThreadLocalMap类型的变量.而ThreadLocalMap是一个定制化的Hashmap。在默认情况下,每个线程中的这两个变量都为null,只有当前线程第一次调用ThreadLocal的set或者get方法时才会创建它们。其实每个线程的本地变量不是存放在ThreadLocal实例里面,而是存放在调用线程的threadLocals变量里面。

也就是说,ThreadLocal类型的本地变量存放在具体的线程内存空间中。ThreadLocal就是一个工具壳,它通过set方法把value值放入调用线程的threadLocals里面并存放起来,当调用线程调用它的get方法时,再从当前线程的threadLocals变量里面将其拿出来使用

如果调用线程一直不终止,那么这个本地变量会一直存放在调用线程的threadLocals变量里面,所以当不需要使用本地变量时可以通过调用ThreadLocal变量的remove方法,从当前线程的threadLocals里面删除该本地变量。另外,Thread里面的threadLocals为何被设计为map结构?很明显是因为每个线程可以关联多个ThreadLocal变量。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

JVM经典五十问

文章目录1.什么是JVM?内存管理2.能说一下JVM的内存区域吗&#xff1f;3.说一下JDK1.6、1.7、1.8内存区域的变化&#xff1f;4.为什么使用元空间替代永久代作为方法区的实现&#xff1f;5.对象创建的过程了解吗&#xff1f;6.什么是指针碰撞&#xff1f;什么是空闲列表&#xf…

增量更新同步_OneDrive增量更新功能正式推出 仅同步文件更改部分降低网络占用...

微软的云存储应用OneDrive目前用户量还是蛮多的&#xff0c;不过在功能更新方面OneDrive动作相对来说还是有些慢的。比如非常实用的增量更新功能直到最近微软才正式推出&#xff0c;现在所有个人和企业级用户都可以使用增量更新功能喽。增量更新功能还是有网友在 2014 年向微软…

Vue 封装的过渡与动画

一、作用&#xff1a;在插入、更新或移除DOM元素时&#xff0c;在合适的时候给元素添加样式类名 二、图示 三、写法&#xff1a; 元素进入的样式 v-enter | v-enter-active | v-enter-to元素离开的样式 v-leave | v-leave-active | v-leave-to使用 transition 包裹要过渡的元…

使用navicat for mysql 创建外键foreign keys时,总会自动创建索引indexs

使用navicat for mysql 创建外键foreign keys时&#xff0c;总会自动创建索引indexs。如果删除这个索引就会提示错误error 1553:cann’t drop index…:needed in a foreign key constraint。请教各位&#xff0c;该如何解决呢&#xff0c;不想要indexs 这个好像必须要吧 主键默…

固定 顶部_优质的阳光板温室的顶部应该如此安装,专业的人做专业的事

阳光板温室多为文洛型&#xff0c;多采用一跨多顶&#xff0c;外形现代&#xff0c;结构稳定&#xff0c;形式美观大方&#xff0c;视觉流畅&#xff0c;保温性能卓越&#xff0c;透光率适中&#xff0c;多雨槽&#xff0c;大跨度&#xff0c;排水量大&#xff0c;抗风能力强&a…

json对象、json字符串的区别和相互转换

开发时&#xff0c;json字符串和json对象傻傻分不清楚&#xff0c;ajax异步请求后&#xff0c;会根据返回的data值判断请求是否成功&#xff0c;访问data.msg会提示‘undefined’&#xff0c;将data转换为json对象即可。 一、json对象、json字符串的区别 1、json对象 json对…

idea中常用的快捷键以及一些奇淫技巧 , 加快我们的开发效率

idea中常用的快捷键以及一些奇淫技巧 &#xff0c; 加快我们的开发效率 &#xff01;&#xff01;&#xff01; 知道类名查找你本地以的类 &#xff08;你pom中依赖的类你自己创建的类&#xff09;------------- ctrlshiftt 修改你创建的变量 以及你后面都引用的变量 &#x…

apache2 php mysql_二、Linux服务器apache2+PHP7+mysql环境配置

关于网站搭建的基础知识&#xff0c;请见我的另一篇文章https://www.jianshu.com/p/9c65fcb14e4f此处不加赘述。本文仅介绍Linux服务器环境的配置。一、安装包下载与安装1.安装apache2sudo apt-get install apache22.安装PHP//-y的意思是全部默认选择yes//8条命令分8次输入//1s…

前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗?

前端给后端传递数据的时候,有些后端自己可以获取到的值应该由前端传递吗? 场景: 1.比如我向后端传递一个学生做的试卷. 2.后端需要我把学生的答案和标准答案(在获取试卷的时候给我的,我知道很扯淡)同时传递给他. 我认为标准答案没必要传给他 ,因为他可以根据我传给他的试卷…

mysql备份去掉一个库_MySQL备份与恢复(3)mysqldump备份多个库

一、mysqldump的工作原理、利用mysqldump命令备份数据的过程&#xff0c;实际上就是把数据从mysql库以逻辑的sql语句的形式直接输出或生成备份的文件的过程利用这个备份文件恢复的时候的原理&#xff1f;就是把备份的sql命令再执行一遍。二、备份多个库mysql>show databases…

JS 深浅拷贝

在日常开发当中那面会遇到对象拷贝问题 一、对象浅拷贝&#xff08;shallowClone&#xff09; 使用 Object.assign 把源对象自身的、可枚举的属性拷贝到目标对象上 var person {name: 张三,age: 18,sex: 男,hobbies: [篮球, 足球, 排球],sayName: function () {console.log(t…

MySQL 查询速度慢与性能差的原因与解决方法

MySQL 查询速度慢与性能差的原因与解决方法 更新时间&#xff1a;2019年09月26日 18:05:47 作者&#xff1a;Microtiger 随着网站数据量与访问量的增加&#xff0c;MySQL 查询速度慢与性能差的问题就日渐明显&#xff0c;这里为大家分享一下解决方法,需要的朋友可以参考下 一…

mysql+跨服务器+写入_MySQL中使用FREDATED引擎实现跨数据库服务器、跨实例访问

跨数据库服务器&#xff0c;跨实例访问是比较常见的一种访问方式&#xff0c;在Oracle中可以通过DB LINK的方式来实现。对于MySQL而言&#xff0c;有一个FEDERATED存储引擎与之相对应。同样也是通过创建一个链接方式的形式来访问远程服务器上的数据。本文简要描述了FEDERATED存…

MYSQL避免全表扫描__如何查看sql查询是否用到索引(mysql)

MYSQL避免全表扫描 1.对查询进行优化&#xff0c;应尽量避免全表扫描&#xff0c;首先应考虑在 where 及 order by 涉及的列上建立索引 2.应尽量避免在 where 子句中对字段进行 null 值判断&#xff0c;否则将导致引擎放弃使用索引而进行全表扫描 如&#xff1a;select id f…

@SuppressWarnings使用的正确姿势

SuppressWarnings比较常见&#xff0c;理解和使用起来都很简单。 但是就这这个机会系统的整理一下。 通过源码可以看出&#xff0c;支持在类、属性、方法、参数、构造方法、本地变量上使用。 SuppressWarnings注解的使用有三种&#xff1a; SuppressWarnings(“unchecked”)…

mysql5.7.3安装教程_最新mysql 5.7.23安装配置图文教程

2018年最新MySQL5.7详细安装与配置&#xff0c;总共分为四步&#xff0c;其中环境变量配置不是必须的。1、安装包下载2、安装过程3、环境变量配置4、连接测试一、官网下载MYSQL安装包2.选择合适你电脑系统的版本进行安装。如果有网络&#xff0c;选择在线安装的版本&#xff0c…

MySQL 添加where 1= 1 是否会引起索引失效

背景 在检查数据库的执行效率的时候&#xff0c;发现了一条查询极慢的查询sql。sql的例子如下&#xff1a; EXPLAIN SELECT * FROM user_point_detail_info WHERE 11 AND deleted FALSE AND app_id 2010001 AND point > 10 AND add_time BETWEEN "2021-03-12 17:0…

mysql回档命令_MySQL 备份恢复

1&#xff1a;备份常用工具&#xff1a;mysqldump, xtrabackupmysqldump: 原生数据导出工具&#xff0c;以sql的形式导出保存xtrabackup: percona团队提供的备份工具&#xff0c;基于文件系统的备份2&#xff1a;备份全库&#xff1a;mysqldump -h10.6.29.1 -uroot -p --all-da…

MySQL在like查询中是否使用到索引

mysql在使用like查询中&#xff0c;能不能用到索引&#xff1f;在什么地方使用索引呢&#xff1f; 在使用like的时候&#xff0c;如果使用‘%%’&#xff0c;会不会用到索引呢&#xff1f; EXPLAIN SELECT * FROM user WHERE username LIKE %ptd_%;上面的结果是全表扫描&#…

elasticsearch scroll 一页最大数据量_elasticsearch 百亿级数据检索案例与原理

一、前言数据平台已迭代三个版本&#xff0c;从头开始遇到很多常见的难题&#xff0c;终于有片段时间整理一些已完善的文档&#xff0c;在此分享以供所需朋友的实现参考&#xff0c;少走些弯路&#xff0c;在此篇幅中偏重于ES的优化&#xff0c;关于HBase&#xff0c;Hadoop的设…