路漫漫其修遠兮,吾將上下而求索
經(jīng)驗淺薄,耐心積累;記性不好,記諸文字
BlogJava
首頁
新隨筆
聯(lián)系
聚合
管理
隨筆-204 評論-149 文章-0 trackbacks-0
Java transient關(guān)鍵字
Volatile修飾的成員變量在每次被線程訪問時,都強迫從主內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時,強迫線程將變化值回寫到主內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
Java語言規(guī)范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當(dāng)線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
這樣當(dāng)多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關(guān)鍵字就是提示VM:對于這個成員變量不能保存它的私有拷貝,而應(yīng)直接與共享成員變量交互。
使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當(dāng)要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。
由于使用volatile屏蔽掉了VM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時才使用此關(guān)鍵字。
java關(guān)鍵字Transient
轉(zhuǎn)自http:
//
horst.sun.blog.163.com/blog/static/348849612007614494492/
翻譯自http:
//
www.devx.com/tips/Tip/13726。
Java的serialization提供了一種持久化對象實例的機制。當(dāng)持久化對象時,可能有一個特殊的對象數(shù)據(jù)成員,我們不想
用serialization機制來保存它。為了在一個特定對象的一個域上關(guān)閉serialization,可以在這個域前加上關(guān)鍵字transient。
transient是Java語言的關(guān)鍵字,用來表示一個域不是該對象串行化的一部分。當(dāng)一個對象被串行化的時候,transient型變量的值不包括在串行化的表示中,然而非transient型的變量是被包括進去的。
注意static變量也是可以串行化的
首先,讓我們看一些Java serialization的代碼:
public
class
LoggingInfo
implements
java.io.Serializable
{
private
Date loggingDate
=
new
Date();
private
String uid;
private
transient
String pwd;
LoggingInfo(String user, String password)
{
uid
=
user;
pwd
=
password;
}
public
String toString()
{
String password
=
null
;
if
(pwd
==
null
)
{
password
=
"
NOT SET
"
;
}
else
{
password
=
pwd;
}
return
"
logon info: \n
"
+
"
user:
"
+
uid
+
"
\n logging date :
"
+
loggingDate.toString()
+
"
\n password:
"
+
password;
}
}
現(xiàn)在我們創(chuàng)建一個這個類的實例,并且串行化(serialize)它 ,然后將這個串行化對象寫如磁盤。
LoggingInfo logInfo
=
new
LoggingInfo(
"
MIKE
"
,
"
MECHANICS
"
);
System.out.println(logInfo.toString());
try
{
ObjectOutputStream o
=
new
ObjectOutputStream(
new
FileOutputStream(
"
logInfo.out
"
));
o.writeObject(logInfo);
o.close();
}
catch
(Exception e)
{
//
deal with exception}
To read the object back, we can write
try
{
ObjectInputStream in
=
new
ObjectInputStream(
new
FileInputStream(
"
logInfo.out
"
));
LoggingInfo logInfo
=
(LoggingInfo)in.readObject();
System.out.println(logInfo.toString());
}
catch
(Exception e)
{
//
deal with exception}
如果我們運行這段代碼,我們會注意到從磁盤中讀回(read——back (de
-
serializing))的對象打印password為
"
NOT SET
"
。這是當(dāng)我們定義pwd域為transient時,所期望的正確結(jié)果。
現(xiàn)在,讓我們來看一下粗心對待transient域可能引起的潛在問題。假設(shè)我們修改了類定義,提供給transient域一個默認值,
代碼如下:
public
class
GuestLoggingInfo
implements
java.io.Serializable
{
private
Date loggingDate
=
new
Date();
private
String uid;
private
transient
String pwd;
GuestLoggingInfo()
{
uid
=
"
guest
"
;
pwd
=
"
guest
"
;
}
public
String toString()
{
//
same as above
}
}
現(xiàn)在,如果我們穿行化GuestLoggingInfo的一個實例,將它寫入磁盤,并且再將它從磁盤中讀出,我們?nèi)匀豢吹阶x回的對象打印password 為
"
NOT SET
"
。當(dāng)從磁盤中讀出某個類的實例時,實際上并不會執(zhí)行這個類的構(gòu)造函數(shù),
而是載入了一個該類對象的持久化狀態(tài),并將這個狀態(tài)賦值給該類的另一個對象。
posted on 2009-06-20 18:23
Frank_Fang
閱讀(110482)
評論(26)
編輯
收藏
所屬分類:
Java編程
評論:
#
re: Java transient關(guān)鍵字[未登錄] 2011-06-17 16:35 |
1
1
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2011-06-17 16:36 |
1
@1
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2011-08-05 14:41 |
zg
useful
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2011-09-11 21:35 |
奪
學(xué)習(xí)了 謝謝
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2012-03-15 17:46 |
###
非常不錯
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2012-06-28 09:58 |
大家點擊開
受教了,多謝!
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2012-08-06 23:48 |
aaa
very good!!!
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2012-09-04 16:45 |
過客
學(xué)習(xí)了,非常好!
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2012-10-11 07:40 |
whoiam8485
講得非常好,終于懂了
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2013-01-05 12:33 |
bruce
把private transient String pwd; 修改為private String pwd;
我在機器上測試了下,不會輸出 "NOT SET"
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2013-05-30 10:13 |
AlexSeeker
“由于使用volatile屏蔽掉了VM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時才使用此關(guān)鍵字。”
volatile省略了把變量拷貝到線程的私有空間 和 從私有空間寫回到主內(nèi)存空間的過程,應(yīng)該是效率提高才對吧?!
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2013-08-08 09:50 |
sleve
@AlexSeeker
這個拷貝實際作用就是一種緩存,“只當(dāng)線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比”,是一種優(yōu)化手段,而 volatile是取消了這種機制,每次都去“直接與共享成員變量交互”,所以效率要低,這話沒錯
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2013-11-03 10:28 |
chump
@bruce
可以輸出
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2014-03-07 17:05 |
lephix
@AlexSeeker
效率是低喲, 因為如果在線程里面頻繁的獲取和修改該變量,那么都必須要到主內(nèi)存里面進行操作,而優(yōu)化過的代碼可能會把該變量放在這個線程所在CPU的CACHE里面,而CACHE比MEM快,所以是變慢了。
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2014-05-09 09:47 |
來客
@AlexSeeker
確實省去了2次交互(子線程開始,結(jié)束的時候各跟主線程交互1次),但卻改成了動不動和主內(nèi)存交互。只要在子線程中每次讀或者改volatile變量值,就立刻從主內(nèi)存中讀取或?qū)懟氐街鲀?nèi)存。以前只是2次交互,現(xiàn)在可能N次了。
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2014-07-15 16:50 |
sdf
sb
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2015-01-23 12:23 |
blueocean
言簡意賅
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2015-03-27 11:26 |
anding
a little useful
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2015-04-08 10:02 |
xx
你最前面對volatile的解釋有一半是錯誤的!!
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2015-12-10 17:47 |
穎輝小居
錯的離譜最后幾句是完全錯的離譜啊,磁盤讀出的時候當(dāng)然不會執(zhí)行構(gòu)造了,構(gòu)造是你在存到磁盤的時候執(zhí)行的。你存到磁盤的時候是一個對象。這里肯定是new的就會執(zhí)行構(gòu)造了。那個關(guān)鍵字是在序列化為對象流的時候起作用的。屏蔽了pwd這個字段,不將他放入流中。磁盤里當(dāng)然就沒有這個屬性了。所有的對象只保存屬性,不保存函數(shù)。函數(shù)是功能,是在類中定義的。所有這個類的對象都能調(diào)用函數(shù),但是你傳遞對象的時候只有屬性。這個pwd沒有被序列化,就不會再磁盤里。讀出數(shù)據(jù)的時候(getPWD())也就沒有這個屬性值。
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2015-12-10 23:59 |
DOUDOU
解釋有誤
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄] 2015-12-11 00:00 |
DOUDOU
最后幾句解釋的卻不太正確
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2016-03-13 20:11 |
seancheer
很不錯。
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2016-03-22 13:02 |
55
555
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字 2016-04-07 14:50 |
333
我想說static也不能被序列化。。。,附上說明:The readObject method is responsible for reading from the stream and restoring the classes fields. It may call in.defaultReadObject to invoke the default mechanism for restoring the object's non-static and non-transient fields
回復(fù)
更多評論
#
re: Java transient關(guān)鍵字[未登錄]
2016-04-10 20:20 |
aa
@AlexSeeker
volatile屏蔽了重排序優(yōu)化
回復(fù)
更多評論
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
t.interrupt(),t.isInterrupted(),Thread.interrupted()
【轉(zhuǎn)】線程中的默認異常處理
Java中主線程如何捕獲子線程拋出的異常
【轉(zhuǎn)】Java1.5泛型指南中文版(Java1.5 Generic Tutorial)
Java集合類小結(jié)
Java反射機制學(xué)習(xí)小結(jié)
Java Hashtable分析
Java 內(nèi)存模型及 volatile關(guān)鍵字語義
[轉(zhuǎn)]J2EE項目異常處理
Java transient關(guān)鍵字
<
2016年4月
>
日
一
二
三
四
五
六
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
6
7
常用鏈接
我的隨筆
我的評論
我的參與
最新評論
留言簿
(1)
給我留言
查看公開留言
查看私人留言
隨筆分類
(204)
Andriod(2)
bcel javassist(9)
C++編程(23)
Design Pattern(36)
JAVA WS(16)
Java 網(wǎng)絡(luò)編程(1)
Java編程(44)
JNI(1)
Linux | ACE網(wǎng)絡(luò)編程(13)
Python學(xué)習(xí)(4)
SSH+JQuery+DWR(39)
數(shù)據(jù)結(jié)構(gòu)與算法(12)
筆試,面試經(jīng)驗(4)
隨筆檔案
(100)
2009年8月 (17)
2009年7月 (21)
2009年6月 (21)
2009年5月 (32)
2009年4月 (9)
收藏夾
(8)
牛人博客文章鏈接(8)
牛人博客鏈接
搜索
最新評論
1.?re: Java transient關(guān)鍵字[未登錄]
@AlexSeeker
volatile屏蔽了重排序優(yōu)化
--aa
2.?re: Java transient關(guān)鍵字
評論內(nèi)容較長,點擊標(biāo)題查看
--333
3.?re: Java transient關(guān)鍵字
555
--55
4.?re: Java transient關(guān)鍵字
很不錯。
--seancheer
5.?re: Java Serializable小結(jié)
過來看看
--vacon
閱讀排行榜
1.?Java transient關(guān)鍵字(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關(guān)鍵字(26)
2.?【轉(zhuǎn)】用 BCEL 設(shè)計字節(jié)碼(7)
3.?Struts 注解配置例子及redirect,redirectAction,chain的區(qū)別(6)
4.?Java 內(nèi)存模型及 volatile關(guān)鍵字語義(5)
5.?Java多線程sleep(),join(),interrupt(),wait(),notify()(5)
Powered by:
博客園
模板提供:
滬江博客
Copyright ©2025 Frank_Fang
主站蜘蛛池模板:
国产精品亚洲一区二区三区久久
|
亚洲熟妇无码八AV在线播放
|
在线免费观看视频你懂的
|
18以下岁毛片在免费播放
|
久久精品乱子伦免费
|
日本不卡免费新一区二区三区
|
黄色网站软件app在线观看免费
|
国产精品美女久久久免费
|
亚洲综合久久夜AV
|
亚洲毛片av日韩av无码
|
亚洲精品无码日韩国产不卡?V
|
亚洲成av人在片观看
|
亚洲一区二区高清
|
青青草原亚洲视频
|
亚洲国产精品无码久久久不卡
|
亚洲AV无码一区二区三区DV
|
久久亚洲国产精品
|
亚洲福利电影一区二区?
|
激情综合亚洲色婷婷五月
|
亚洲一区AV无码少妇电影
|
国产成人精品日本亚洲语音
|
亚洲av鲁丝一区二区三区
|
亚洲天堂一区二区
|
亚洲人成电影在线观看青青
|
亚洲成年网站在线观看
|
处破女第一次亚洲18分钟
|
一级毛片不卡免费看老司机
|
成人免费区一区二区三区
|
97公开免费视频
|
一二三四免费观看在线电影
|
黄网址在线永久免费观看
|
久久久久久久亚洲Av无码
|
亚洲一区无码中文字幕乱码
|
亚洲欧美成人av在线观看
|
一个人看www在线高清免费看
|
毛片免费在线视频
|
亚洲综合精品网站在线观看
|
久久99亚洲网美利坚合众国
|
在线观看亚洲AV日韩AV
|
二级毛片免费观看全程
|
免费A级毛片无码视频
|