路漫漫其修远兮,吾将上下而求索
经验浅薄,耐心积累;记性不好,记诸文字
BlogJava
首页
新随笔
联系
聚合
管理
随笔-204 评论-149 文章-0 trackbacks-0
ThreadLocal和synchronized
转:
http://linliangyi2007.javaeye.com/blog/179040
关键字: java 线程 threadlocal
昨天上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的调用关系:
1
public
void
set(T value)
{
2
Thread t
=
Thread.currentThread();
3
ThreadLocalMap map
=
getMap(t);
4
if
(map
!=
null
)
5
map.set(
this
, value);
6
else
7
createMap(t, value);
8
}
9
10
ThreadLocalMap getMap(Thread t)
{
11
return
t.threadLocals;
12
}
(有兴趣的朋友可以阅读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轴,纵向关联了处于同一方法中的不同线程上的变量。
希望能对大家有所帮助,这样可以少走很多弯路哦。
posted on 2009-06-01 21:57
Frank_Fang
阅读(552)
评论(0)
编辑
收藏
所属分类:
Java编程
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
t.interrupt(),t.isInterrupted(),Thread.interrupted()
【转】线程中的默认异常处理
Java中主线程如何捕获子线程抛出的异常
【转】Java1.5泛型指南中文版(Java1.5 Generic Tutorial)
Java集合类小结
Java反射机制学习小结
Java Hashtable分析
Java 内存模型及 volatile关键字语义
[转]J2EE项目异常处理
Java transient关键字
<
2009年6月
>
日
一
二
三
四
五
六
31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
1
2
3
4
5
6
7
8
9
10
11
常用链接
我的随笔
我的评论
我的参与
最新评论
留言簿
(1)
给我留言
查看公开留言
查看私人留言
随笔分类
(204)
Andriod(2)
bcel javassist(9)
C++编程(23)
Design Pattern(36)
JAVA WS(16)
Java 网络编程(1)
Java编程(44)
JNI(1)
Linux | ACE网络编程(13)
Python学习(4)
SSH+JQuery+DWR(39)
数据结构与算法(12)
笔试,面试经验(4)
随笔档案
(100)
2009年8月 (17)
2009年7月 (21)
2009年6月 (21)
2009年5月 (32)
2009年4月 (9)
收藏夹
(8)
牛人博客文章链接(8)
牛人博客链接
搜索
最新评论
1. re: Java transient关键字[未登录]
@AlexSeeker
volatile屏蔽了重排序优化
--aa
2. re: Java transient关键字
评论内容较长,点击标题查看
--333
3. re: Java transient关键字
555
--55
4. re: Java transient关键字
很不错。
--seancheer
5. re: Java Serializable小结
过来看看
--vacon
阅读排行榜
1. Java transient关键字(110461)
2. Struts 注解配置例子及redirect,redirectAction,chain的区别(25199)
3. static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?(18074)
4. Java多线程sleep(),join(),interrupt(),wait(),notify()(12780)
5. 线程同步:何时互斥锁不够,还需要条件变量?(9200)
评论排行榜
1. Java transient关键字(26)
2. 【转】用 BCEL 设计字节码(7)
3. Struts 注解配置例子及redirect,redirectAction,chain的区别(6)
4. Java 内存模型及 volatile关键字语义(5)
5. Java多线程sleep(),join(),interrupt(),wait(),notify()(5)