- 浏览: 229944 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
thepastsee:
304572183股票交流 欢迎加入
实时股票 -
345161974:
很不错,我第一个接触的CSS卡片布局效果,多谢
css卡片效果
昨天上Java版块逛了一圈,一个2万5千人浏览的帖子引起了偶滴注意 ThreadLocal与synchronized
,9页以上的回复,足见大家对这个问题的兴趣。
老实说,从看到这个帖子的题目开始,就觉得帖子的作者估计是在概念上有所混淆了,于是乎想写个咚咚,同大家分享一下自己的心得。
帖子上,讨论的人很多,高手不乏,各抒己见,但不知新手们看明白没有,因此,这里偶以最简洁列表方式来说一说相关问题。
1.区别ThreadLocal 与 synchronized
- ThreadLocal是一个线程隔离(或者说是线程安全)的变量存储的管理实体(注意:不是存储用的),它以Java类方式表现;
- synchronized是Java的一个保留字,只是一个代码标识符,它依靠JVM的锁机制来实现临界区的函数、变量在CPU运行访问中的原子性。
两者的性质、表现及设计初衷不同,因此没有可比较性。
2.理解ThreadLocal中提到的变量副本
事实上,我们向ThreadLocal中set的变量不是由ThreadLocal来存储的,而是Thread线程对象自身保存。当用户调用
ThreadLocal对象的set(Object
o)时,该方法则通过Thread.currentThread()获取当前线程,将变量存入Thread中的一个Map内,而Map的Key就是当前的
ThreadLocal实例。请看源码,这是最主要的两个函数,能看出ThreadLocal与Thread的调用关系:
- public void set(T value) {
- Thread t = Thread.currentThread();
- ThreadLocalMap map = getMap(t);
- if (map != null )
- map.set(this , value);
- else
- createMap(t, value);
- }
- ThreadLocalMap getMap(Thread t) {
- return t.threadLocals;
- }
public void set(T value) { Thread t = Thread.currentThread(); ThreadLocalMap map = getMap(t); if (map != null) map.set(this, value); else createMap(t, value); } ThreadLocalMap getMap(Thread t) { return t.threadLocals; }
(有兴趣的朋友可以阅读Java的ThreadLocal源码)因此,我们可以知道,所谓的变量副本,即是对Object Reference(对象引用)的拷贝。
3.理解Thread和 ThreadLocal对变量的引用关系
实际上Thread和ThreadLocal对变量引用关系就像是坐标系中的X轴和Y轴,是从两个维度上来组织对变量的引用的。
- 首先说Thread。 我们知道一个ThreadOne的执行会贯穿多个方法MethodA、MethodB、MethodC这些方法可能分布于不同的类实例。假设,这些方法分 别使用了ThreadLocalA、ThreadLocalB、ThreadLocalC来保存线程本地变量,那么这些变量都存于ThreadOne的 Map中,并使用各自的ThreadLocal实例作为key。 因此,可以认为,借助ThreanLocal的set方法,在X轴上,Thread横向关联同一线程上下文中来自多个Method的变量引用副本。
- 接着说ThreadLocal。 一个MethodA中的X变量将被多个线程ThreadOne、ThreadTwo、ThreadThree所访问。假设MethodA使用 ThreadLocal存储X,通过set方法,以ThreadLocal作为key值,将不同线程来访时的不同的变量值引用保存于ThreadOne、 ThreadTwo、ThreadThree的各自线程上下文中,确保每个线程有自己的一个变量值。因此,可以认为,ThreadLocal是以 Method为Y轴,纵向关联了处于同一方法中的不同线程上的变量。
希望能对大家有所帮助,这样可以少走很多弯路哦。
发表评论
-
jdbc_连接池_转
2012-02-19 22:49 0http://z466459262.iteye.com/bl ... -
java_贪吃蛇——
2012-01-17 11:14 793ADADS -
java并发重构ppt_转温 少
2011-06-23 16:04 621ooooo -
GBK_UTF-8_转
2011-06-21 11:15 1513转 http://www.iteye.com/topi ... -
单例模式七种写法_转
2011-05-26 23:19 749kjljkl -
设计模式_code_转转转
2011-05-25 17:14 640kljlj -
java_字符串操作——插入、替换、删除_转
2011-03-18 18:38 1215字符串操作——插入、替换、删除 ... -
mysq 存储过程技术手册
2011-02-17 22:49 423jklkj -
mysql专家_分析pdf
2011-02-17 20:43 828dfasdfasdf -
成均科技_面试
2011-02-16 17:38 821成均科技: XmlHttpRequest 浏览器对 ... -
java 学习方向
2011-01-26 16:56 641http://newleague.iteye.com/ ... -
多线程背课__售票_转转转
2011-01-25 10:19 749票真难买呀,咋回个家就怎么难呢? 这几天学习了下线程, ... -
web 项目_ log4j__转转java3Z
2011-01-18 22:16 972在web应用中使用日志工具log4J ... -
汉字排序_java_转转
2011-01-15 17:09 870java中漢字按拼音排序 ... -
ecilpse_apanta_
2011-01-15 00:11 973<!-- [if gte mso 9]><x ... -
linux_virutalBox_固定ip_转转
2011-01-12 21:35 924Windows XP通过Sun VirtualBox ... -
存储过程_转转转 _ibatis
2011-01-04 21:14 1266作者:袁光东 我们在进行pl/sql编程时打交道最多的 ... -
J2EE项目异常处理_转
2011-01-04 21:08 663J2EE 项目异常处理 ... -
防盗链_图片
2010-12-30 08:57 850做个图片的防盗链 ... -
java 缩略图__转
2010-12-24 00:29 714//----------------------------- ...
相关推荐
ThreadLocal_ThreadLocal源码分析_源码.zip
NULL 博文链接:https://kaka100.iteye.com/blog/731818
ThreadLocal源码分析,主要有ThreadLocal源码以及ThreadLocal的内部结构在jdk8前后的变化
04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、...
ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。
ThreadLocal
ThreadLocal应用示例及理解,这个写了相关的示例,可以参考一下。
理解ThreadLocal 理解ThreadLocal 理解ThreadLocal 理解ThreadLocal
学习ThreadLocal,了解其中的原理,以及学习其中的优点!避免坑点!!
正确理解ThreadLocal.pdf
DbUTils中用ThreadLocal类
主要介绍ThreadLocal的原理,实例分析以及注意事项
javaee开发常见的模式有MVC模式,在C层中常常会再次分层,如:servlet(web层)、service(业务逻辑层)、dao(数据访问层),其中service和dao最容易混在一起,如转...所以,使用ThreadLocal可以解决这样的分层问题。
java 简单的ThreadLocal示例
ThreadLocal的几种误区ThreadLocal的几种误区ThreadLocal的几种误区
NULL 博文链接:https://ollevere.iteye.com/blog/1150526
Python 兵法编程 265_ThreadLocal的使用.mp4
本例以序列号生成的程序为例,展示ThreadLocal的使用
ThreadLocal保证一个类的实例变量在各个线程中都有一份单独的拷贝, 从而不会影响其他线程中的实例变量