理解ThreadLocal

ThreadLocal:线程本地存储,为每个线程都创建了变量的副本,线程在访问变量时,可以直接访问自己内部的副本变量。
理解几个概念:
在java中ThreadLocal是一个类。
ThreadMap是一个类,
Thread类是线程类。

ThreadLocal类中有一个ThreadMap的内部类。
Thread类中有一个成员变量是threadLocals
其类型为:ThreadLocalMap
ThreadLocal.ThreadLocalMap threadLocals = null;
ThreadLocalMap的key值为ThreadLocal类型。

通过ThreadLocal为threadLocals添加值:

package processthread; /** * @author wangpei * @version *创建时间:2017年3月11日 下午2:16:48 * 类说明 */
public class ThreadLocalTest {public static ThreadLocal<Integer> longLocal=new ThreadLocal<Integer>();public static void main(String[] args) {ThreadLocalTest th=new ThreadLocalTest();ThreadLocalTest.ThreadTest thread=th.new ThreadTest ();thread.start();ThreadLocalTest.ThreadTest2 thread2=th.new ThreadTest2 ();thread2.start();}class ThreadTest extends Thread{public void run(){System.out.println("线程"+Thread.currentThread().getName()+"正在执行");ThreadLocalTest v=new ThreadLocalTest();v.longLocal.set(2);System.out.println(v.longLocal.get());}   }class ThreadTest2 extends Thread{public void run(){System.out.println("线程"+Thread.currentThread().getName()+"正在执行");ThreadLocalTest v=new ThreadLocalTest();v.longLocal.set(3);System.out.println(v.longLocal.get());}}}

结果:
线程Thread-0正在执行
2
线程Thread-1正在执行
3

执行上面的结果可以看出,thread-0通过ThreadLocal写入自己的副本变量2,thread-1通过ThreadLocal写入自己的副本变量3
这两个副本变量是线程中私有的空间。
源码分析:
ThreadLocal的set方法:

 public void set(T value) {Thread t = Thread.currentThread();ThreadLocalMap map = getMap(t);if (map != null)map.set(this, value);elsecreateMap(t, value);}

解释:map中存放当前线程的threadLocals的值,如果map不为空,则
为map存放一个key值为当前ThreadLocal的Entry

  ThreadLocalMap getMap(Thread t) {return t.threadLocals;}

ThreadLocal 的get方法:

ThreadLocalMap getMap(Thread t) {return t.threadLocals;}

返回线程t的threafLocals值。

ThreadLocal的应用:jdbc操作数据库时,建立连接,如果在多线程情况下,必须加锁实现同步,而此时,效率会大大降低。
可以为将connection写进每个线程的threadLocals中,实现同步。这样每个线程都有自己的connection副本,每个线程间互不影响。

转载于:https://www.cnblogs.com/wangxiaopei/p/8551232.html

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

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

相关文章

抖音右上角一个小黄点是什么_抖音官方入驻视频号,释放了一个什么样的信号?...

专注视频号观察第 328 篇这几天&#xff0c;视频号生态新入驻了一个企业号&#xff0c;在圈里引起不少的轰动&#xff0c;因为这个号的名字叫做———抖音。这件事在圈里引发不少的轰动&#xff0c;很多人惊叹&#xff1a;“连抖音都来开视频号了&#xff0c;你还在等什么&…

资源包技巧和最佳实践

今天是资源捆绑日。 通常&#xff0c;这是Java中最著名的国际化机制&#xff08;i18n&#xff09;。 使用它应该很容易。 但是&#xff0c;在弄脏手时会出现许多小问题。 如果您有相同的想法&#xff0c;则此文章适合您。 基本 java.util.ResourceBundle定义了用于访问Java中翻…

springMvc-文件上传

赶时间&#xff0c;又在写垃圾博客&#xff0c;在心里给自己一耳巴 1.单文件上传 2.多文件上传 代码&#xff1a; 页面&#xff1a; <!DOCTYPE html><html><head><meta charset"UTF-8"><title>Insert title here</title></he…

c cuda 指定gpu_GPU并行编程:熟练使用CUDA C语言

【IT168 专稿】一个大任务通常可能被分解成许多可以一起处理的小任务&#xff0c;以便创建一个解决方案&#xff0c;这和粉刷房子的道理是一样的&#xff0c;在粉刷之前&#xff0c;假设你需要买5公升油漆和5把刷子&#xff0c;你可以自己一个人干完采购和粉刷的活&#xff0c;…

js中使用0 “” null undefined {}需要注意

注意&#xff1a;在js中0为空&#xff08;false&#xff09; &#xff0c;代表空的还有“”&#xff0c;null &#xff0c;undefined&#xff1b; 如果做判断if(&#xff01;上面的四种值)&#xff1b;返回均为false console.log(!null);// true console.log(!0);//true consol…

PhpStorm 10.0.3破解版下载

汉化破解版软件下载&#xff1a; http://pan.baidu.com/s/1geNO24r 密码: d5ci 这个汉化破解软件解决了大纲视图里空白的问题。 先安装腾讯电脑管家&#xff0c;然后安装这个软件&#xff0c;安装到最后提示有个文件有病毒已删除&#xff0c;点确定后正常使用。转载于:https://…

Jenkins:部署JEE工件

随着持续集成和持续交付的出现 &#xff0c;我们的构建被分为不同的步骤&#xff0c;以创建部署管道。 这些步骤中的一些步骤可以是例如编译和运行快速测试&#xff0c;运行慢速测试&#xff0c;运行自动验收测试或发布应用程序等。 部署流程的最后一步意味着将我们的产品&…

seafile 部署_Seafile开启webdav及读写性能测试

为什么要在seafile搞webdavSeafile 一直是一款可靠的文件同步web应用&#xff0c;经过个人测试&#xff0c;同一台机器上&#xff0c;seafile在传输文件时的速度比nextcloud要快&#xff08;可能也与php的设置有关系&#xff09;&#xff0c;这是seafile的优势。但是&#xff0…

Python--校园网爬虫记

查成绩&#xff0c;算分数&#xff0c;每年的综合测评都是个固定的过程&#xff0c;作为软件开发者&#xff0c;这些过程当然可以交给代码去做&#xff0c;通过脚本进行网络请求获取数据&#xff0c;然后直接进行计算得到基础分直接填表就好了&#xff0c;查成绩再手动计算既容…

Spring–添加SpringMVC –第1部分

欢迎来到本教程的第四部分。 在这一部分中&#xff0c;我们将使用Spring MVC编写控制器和视图&#xff0c;并考虑我们的REST模型。 我们必须做的第一件事&#xff0c;就是根据目前的情况制作一个Web应用程序。 我们将web / WEB-INF文件夹添加到我们的项目根目录。 在WEB-INF内创…

[Linux] 权限与指令间的关系

我们知道权限对于使用者帐号来说是非常重要的&#xff0c;因为他可以限制使用者能不能读取/创建/删除/修改文件或目录&#xff01; 在这一章我们介绍了很多文件系统的管理指令&#xff0c;第五章则介绍了很多文件权限的意义。在这个小节当中&#xff0c; 我们就将这两者结合起来…

access month函数用法_学会了这7个EXCEL日期函数技巧,老板再让你加班,你找我!...

日期函数&#xff0c;常用年月日&#xff0c;时分秒&#xff0c;星期&#xff0c;季度&#xff0c;求差值等&#xff0c;学会以下几个函数&#xff0c;老板再让你加班&#xff0c;你找我&#xff01;1、记录当前时间(不随系统时间变化)NOW()函数与数据有效性结合&#xff0c;记…

css样式表的选择器与分类

css 样式表的作用&#xff1a; 主要用于结构,样式与行为,CSS主要的作用就是美化网页的一个语言,它的特点: 1.结构与样式分离的方式,便于后期维护与改版; 2.样式定义精确到像素的级别; css样式表的结构&#xff1a;CSS 称为层叠样式表 用于给网页设置各种样式 css样式的语法由3部…

Spring 3.1缓存和@Cacheable

缓存在软件领域已经存在很长时间了。 它们是那些真正有用的东西之一&#xff0c;一旦您开始使用它们&#xff0c;您会想知道如果没有它们&#xff0c;您是如何相处的&#xff0c;所以似乎让Spring的家伙们只是在版本中向Spring核心添加缓存实现有点奇怪。 3.1。 我猜想以前没有…

pytorchyolov4训练_使用pytorch-yolov5 訓練自己的數據集-2020.6.15

make yolov5 pytorch train datasets训练所需环境 python3.5, pytorch1.3, torchvision 0.4.1 , tensorboard 1.14.0 , tensorflow-gpu1.14.0本例制作yolov5数据集 并进行数据训练从VOC数据集转为训练所需的coco数据集代码有待改进包含文件夹voc2coco/(Annotations/ JPEGImages…

meta 的作用 搜集

Meta标签中的format-detection属性及含义 format-detection翻译成中文的意思是“格式检测”&#xff0c;顾名思义&#xff0c;它是用来检测html里的一些格式的&#xff0c;那关于meta的format-detection属性主要是有以下几个设置&#xff1a;<meta name"format-detecti…

Web服务安全性和SOA路线图的人为维度

在大多数非平凡的SOA环境中&#xff0c;很难跟踪系统之间不断发展的集成&#xff0c;除非有明确的发布和查找适当信息的方法。 概述IT环境&#xff0c;定义当前或将要连接的内容&#xff0c;是维护环境的先决条件。 缺少这种情况通常会导致“面向意大利面条的环境”的感觉&…

pccad自定义图框_(PCCAD自定义标题栏详细方法.doc

PCCAD2011自定义标题栏详细方法下面以图3-1为例说明标题栏的自定义过程。图3-11&#xff0e;新建文件(用New 命令)。2&#xff0e;用绘图和文字中的相关命令设计出图3-1所示的图形。其中在使用中不变的内容&#xff0c;如厂名等均用“文字”命令标出&#xff0c;而需临时填充的…

ThinkPHP 3.2.x 集成极光推送指北

3.2版本已经过了维护生命周期&#xff0c;官方已经不再维护&#xff0c;请及时更新至5.0版本 —— ThinkPHP 官方仓库 以上&#xff0c;如果有条件&#xff0c;请关闭这个页面&#xff0c;然后升级至 ThinkPHP 5&#xff0c;如果由于各种各样的原因无法升级至 TP 5 &#xff0c…

Java:选择正确的集合

这是在应用程序中选择Set &#xff0c; List或Map的正确实现的快速指南。 最好的通用或“主要”实现可能是ArrayList&#xff0c;LinkedHashMap和LinkedHashSet。 它们的整体性能更好&#xff0c;除非您需要其他实现提供的特殊功能&#xff0c;否则应使用它们。 该特殊功能通常…