路漫漫其修遠兮,吾將上下而求索
經驗淺薄,耐心積累;記性不好,記諸文字
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-204 評論-149 文章-0 trackbacks-0
ThreadLocal和synchronized
轉:
http://linliangyi2007.javaeye.com/blog/179040
關鍵字: java 線程 threadlocal
昨天上Java版塊逛了一圈,一個2萬5千人瀏覽的帖子引起了偶滴注意
ThreadLocal與synchronized
,9頁以上的回復,足見大家對這個問題的興趣。
老實說,從看到這個帖子的題目開始,就覺得帖子的作者估計是在概念上有所混淆了,于是乎想寫個咚咚,同大家分享一下自己的心得。
帖子上,討論的人很多,高手不乏,各抒己見,但不知新手們看明白沒有,因此,這里偶以最簡潔列表方式來說一說相關問題。
1.區(qū)別ThreadLocal 與 synchronized
ThreadLocal是一個線程隔離(或者說是線程安全)的變量存儲的管理實體(注意:不是存儲用的),它以Java類方式表現(xiàn);
synchronized是Java的一個保留字,只是一個代碼標識符,它依靠JVM的鎖機制來實現(xiàn)臨界區(qū)的函數(shù)、變量在CPU運行訪問中的原子性。
兩者的性質、表現(xiàn)及設計初衷不同,因此沒有可比較性。
2.理解ThreadLocal中提到的變量副本
事實上,我們向ThreadLocal中set的變量不是由ThreadLocal來存儲的,而是Thread線程對象自身保存。當用戶調用ThreadLocal對象的set(Object o)時,該方法則通過Thread.currentThread()獲取當前線程,將變量存入Thread中的一個Map內,而Map的Key就是當前的ThreadLocal實例。請看源碼,這是最主要的兩個函數(shù),能看出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的執(zhí)行會貫穿多個方法MethodA、MethodB、MethodC這些方法可能分布于不同的類實例。假設,這些方法分別使用了ThreadLocalA、ThreadLocalB、ThreadLocalC來保存線程本地變量,那么這些變量都存于ThreadOne的Map中,并使用各自的ThreadLocal實例作為key。 因此,可以認為,借助ThreanLocal的set方法,在X軸上,Thread橫向關聯(lián)同一線程上下文中來自多個Method的變量引用副本。
接著說ThreadLocal。 一個MethodA中的X變量將被多個線程ThreadOne、ThreadTwo、ThreadThree所訪問。假設MethodA使用ThreadLocal存儲X,通過set方法,以ThreadLocal作為key值,將不同線程來訪時的不同的變量值引用保存于ThreadOne、ThreadTwo、ThreadThree的各自線程上下文中,確保每個線程有自己的一個變量值。因此,可以認為,ThreadLocal是以Method為Y軸,縱向關聯(lián)了處于同一方法中的不同線程上的變量。
希望能對大家有所幫助,這樣可以少走很多彎路哦。
posted on 2009-06-01 21:57
Frank_Fang
閱讀(558)
評論(0)
編輯
收藏
所屬分類:
Java編程
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
t.interrupt(),t.isInterrupted(),Thread.interrupted()
【轉】線程中的默認異常處理
Java中主線程如何捕獲子線程拋出的異常
【轉】Java1.5泛型指南中文版(Java1.5 Generic Tutorial)
Java集合類小結
Java反射機制學習小結
Java Hashtable分析
Java 內存模型及 volatile關鍵字語義
[轉]J2EE項目異常處理
Java transient關鍵字
<
2009年11月
>
日
一
二
三
四
五
六
25
26
27
28
29
30
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
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(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)
數(shù)據(jù)結構與算法(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屏蔽了重排序優(yōu)化
--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關鍵字(110482)
2.?Struts 注解配置例子及redirect,redirectAction,chain的區(qū)別(25240)
3.?static全局變量與普通的全局變量有什么區(qū)別?static局部變量和普通局部變量有什么區(qū)別?static函數(shù)與普通函數(shù)有什么區(qū)別?(18085)
4.?Java多線程sleep(),join(),interrupt(),wait(),notify()(12814)
5.?線程同步:何時互斥鎖不夠,還需要條件變量?(9240)
評論排行榜
1.?Java transient關鍵字(26)
2.?【轉】用 BCEL 設計字節(jié)碼(7)
3.?Struts 注解配置例子及redirect,redirectAction,chain的區(qū)別(6)
4.?Java 內存模型及 volatile關鍵字語義(5)
5.?Java多線程sleep(),join(),interrupt(),wait(),notify()(5)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Frank_Fang
主站蜘蛛池模板:
国产精品永久免费
|
曰曰鲁夜夜免费播放视频
|
亚洲精品线在线观看
|
久久久久国产精品免费免费搜索
|
亚洲第一综合天堂另类专
|
青柠影视在线观看免费
|
亚洲高清日韩精品第一区
|
日韩伦理片电影在线免费观看
|
一级午夜免费视频
|
亚洲成av人片在线看片
|
亚洲国产精品成人网址天堂
|
19禁啪啪无遮挡免费网站
|
粉色视频免费入口
|
亚洲美女大bbbbbbbbb
|
亚洲成年看片在线观看
|
久久久久久毛片免费播放
|
可以免费观看的国产视频
|
涩涩色中文综合亚洲
|
国产AV无码专区亚洲AV男同
|
卡一卡二卡三在线入口免费
|
久久青草免费91观看
|
无码天堂亚洲国产AV
|
亚洲毛片无码专区亚洲乱
|
国产精品亚洲二区在线观看
|
国产一卡二卡≡卡四卡免费乱码
|
久久免费动漫品精老司机
|
深夜a级毛片免费无码
|
亚洲乱码中文字幕小综合
|
久久99国产亚洲高清观看首页
|
日韩一级在线播放免费观看
|
久久精品国产免费观看
|
久久精品免费电影
|
在线播放国产不卡免费视频
|
亚洲精品国产suv一区88
|
国产成人精品日本亚洲专一区
|
亚洲AV无码精品色午夜果冻不卡
|
免费精品久久天干天干
|
羞羞视频免费网站含羞草
|
亚洲jizzjizz在线播放久
|
久久亚洲中文字幕精品有坂深雪
|
国产成人高清亚洲
|