詩特林-sterning
posts - 310, comments - 6939, trackbacks - 0, articles - 3
BlogJava
::
首頁
::
新隨筆
::
聯(lián)系
::
聚合
::
管理
日歷
<
2007年9月
>
日
一
二
三
四
五
六
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
6
隨筆分類
.NET(4)
Android(4)
BI(12)
Bing MAP(2)
C#(3)
DesignPattern(3)
English(30)
Firend Blog(1)
GIS(14)
Google(15)
J2EE(30)
J2ME(3)
Java(16)
JavaScript(8)
Java與外企(13)
JPA(2)
JSF(9)
Oracle(33)
PMP(6)
SAP(25)
Socket(10)
Spring(1)
Struts(12)
Swing(3)
Think In Java 4th(2)
圖形天下(3)
生活隨筆(20)
系統(tǒng)架構(gòu)(7)
職場(2)
軟件測試(3)
項(xiàng)目管理(10)
隨筆檔案
2010年12月 (1)
2010年9月 (1)
2010年8月 (2)
2010年7月 (3)
2010年6月 (3)
2010年5月 (2)
2010年4月 (7)
2010年3月 (4)
2010年2月 (2)
2010年1月 (4)
2009年11月 (4)
2009年10月 (7)
2009年9月 (4)
2009年8月 (5)
2009年7月 (4)
2009年6月 (4)
2009年5月 (6)
2009年4月 (12)
2009年3月 (7)
2009年2月 (3)
2009年1月 (5)
2008年12月 (2)
2008年11月 (2)
2008年10月 (6)
2008年9月 (4)
2008年7月 (6)
2008年6月 (22)
2008年5月 (4)
2008年4月 (13)
2008年3月 (3)
2008年2月 (1)
2008年1月 (26)
2007年12月 (20)
2007年11月 (11)
2007年10月 (35)
2007年9月 (30)
2007年8月 (15)
2007年7月 (7)
2007年5月 (1)
2006年8月 (4)
2006年7月 (8)
相冊
書法
搜索
積分與排名
積分 - 1382332
排名 - 18
最新評論
1.?re: ORACLE directory 目錄
備份中使用到了,加油研究
--Glorin
2.?re: Struts2+Spring2+Hibernate3 web應(yīng)用示例(七)
增刪改查 小白在學(xué)習(xí)中 樓主多多關(guān)照尼謝謝
--小石同學(xué)
3.?re: Struts2+Spring2+Hibernate3 web應(yīng)用示例(七)
樓主 能不能把 Struts2+Spring2+Hibernate3工程都發(fā)我一份
960760087@qq.com 謝謝樓主
--小石同學(xué)
4.?re: 用Java實(shí)現(xiàn)FTP批量大文件上傳下載(六)--代碼及示例下載
樓主真大神, 我最近在做FTP批量下載圖片,但是遇到不少問題,如果能發(fā)一份源給我,我真的萬分感激 ,我的郵箱是450479001@qq.com
--啊謙
5.?re: Java做的酒店管理系統(tǒng)(C/S)源碼
可以麻煩樓主發(fā)一份給我嗎,最近在做這方面的作業(yè),想學(xué)習(xí)學(xué)習(xí),,謝謝樓主了!1587122459@qq.com
--肖敏
閱讀排行榜
1.?多線程Java Socket編程示例(92572)
2.?Java基于Socket文件傳輸示例(91389)
3.?Eclipse中最常用的10個快捷鍵(48738)
4.?用Java實(shí)現(xiàn)FTP批量大文件上傳下載(一)(41162)
5.?Struts2+Spring2+Hibernate3 web應(yīng)用示例(一)(40721)
評論排行榜
1.?Java做的酒店管理系統(tǒng)(C/S)源碼(2300)
2.?基于WEB的批量大文件上傳下載技術(shù)共享(含源代碼)(988)
3.?系統(tǒng)分析師最新資料(720)
4.?Thinking in Java 第四版(完全)及源代碼(673)
5.?共享到底-軟件設(shè)計(jì)師(高級程序員)資料(264)
Think in Java 4th--Java中的volatile
Posted on 2007-09-11 14:31
詩特林
閱讀(1725)
評論(2)
編輯
收藏
所屬分類:
Think In Java 4th
Think in Java 4th--Java中的volatile
我們知道,在Java中設(shè)置變量值的操作,除了long和double類型的變量外都是原子操作,也就是說,對于變量值的簡單讀寫操作沒有必要進(jìn)行同步。
這在JVM 1.2之前,Java的內(nèi)存模型實(shí)現(xiàn)總是從主存讀取變量,是不需要進(jìn)行特別的注意的。而隨著JVM的成熟和優(yōu)化,現(xiàn)在在多線程環(huán)境下volatile關(guān)鍵字的使用變得非常重要。
在當(dāng)前的Java內(nèi)存模型下,線程可以把變量保存在本地內(nèi)存(比如機(jī)器的寄存器)中,而不是直接在主存中進(jìn)行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續(xù)使用它在寄存器中的變量值的拷貝,造成數(shù)據(jù)的不一致。
要解決這個問題,只需要像在本程序中的這樣,把該變量聲明為volatile(不穩(wěn)定的)即可,這就指示JVM,這個變量是不穩(wěn)定的,每次使用它都到主存中進(jìn)行讀取。一般說來,多任務(wù)環(huán)境下各任務(wù)間共享的標(biāo)志都應(yīng)該加volatile修飾。
Volatile修飾的成員變量在每次被線程訪問時,都強(qiáng)迫從共享內(nèi)存中重讀該成員變量的值。而且,當(dāng)成員變量發(fā)生變化時,強(qiáng)迫線程將變化值回寫到共享內(nèi)存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
Java語言規(guī)范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當(dāng)線程進(jìn)入或者離開同步代碼塊時才與共享成員變量的原始值對比。
這樣當(dāng)多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關(guān)鍵字就是提示VM:對于這個成員變量不能保存它的私有拷貝,而應(yīng)直接與共享成員變量交互。
使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當(dāng)要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。
由于使用volatile屏蔽掉了VM中必要的代碼優(yōu)化,所以在效率上比較低,因此一定在必要時才使用此關(guān)鍵字。
請看如下示例:
1
package
ch17_concurrency;
2
3
4
class
UnresponsiveUI
{
5
private
volatile
double
d
=
1
;
6
public
UnresponsiveUI()
throws
Exception
{
7
while
(d
>
0
)
{
8
d
=
d
+
(Math.PI
+
Math.E)
/
d;
9
}
10
System.in.read();
11
}
12
}
13
14
public
class
_19_ResponsiveUI
extends
Thread
{
15
private
static
volatile
double
d
=
1
;
16
public
_19_ResponsiveUI()
{
17
setDaemon(
true
);
18
start();
19
}
20
public
void
run()
{
21
while
(
true
)
{
22
//
System.out.println(d);
23
d
=
d
+
(Math.PI
+
Math.E)
/
d;
24
}
25
}
26
27
public
static
void
main(String[] args)
throws
Exception
{
28
//
TODO Auto-generated method stub
29
//
new UnresponsiveUI();
30
new
_19_ResponsiveUI();
31
System.in.read();
32
System.out.println(d);
33
}
34
35
}
36
評論
#
re: Think in Java 4th--Java中的volatile
回復(fù)
更多評論
2007-09-11 16:48 by
dennis
volatile需要強(qiáng)調(diào)的一點(diǎn)就是,它僅僅保證多線程環(huán)境下的可見性,不保證操作的原子性,舉的例子不大恰當(dāng)吧,想更多了解還是看看這個帖子
http://www.javaeye.com/topic/109150
#
re: Think in Java 4th--Java中的volatile[未登錄]
回復(fù)
更多評論
2008-05-23 14:26 by
dd
簡單點(diǎn)就是線程在運(yùn)行的時候?yàn)榱颂岣咝仕员辉试S偷一點(diǎn)點(diǎn)懶,即忽視多線程的可能,不更新主存中的原本(線程使用的值是副本)。
VOLATILE即告訴JVM,不能偷懶!
這個特性應(yīng)該是從C移植過來的。而C是沒有線程的,所以說,JAVA的線程其實(shí)做得很勉強(qiáng)。
因?yàn)閺恼Z義的角度講,線程的這種偷懶工作方式應(yīng)該是不被允許的。JVM首先應(yīng)該保證正確性(主存跟工作區(qū)的同步),然后再考慮性能優(yōu)化。不正確的東西,性能再好也是白搭。
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發(fā)表評論。
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關(guān)文章:
Thinking in Java 第四版(完全)及源代碼
Think in Java 4th--Java中的volatile
Powered by:
BlogJava
Copyright © 詩特林
主站蜘蛛池模板:
阿鲁科尔沁旗
|
烟台市
|
岳池县
|
芜湖市
|
高安市
|
新郑市
|
砀山县
|
读书
|
长武县
|
潜山县
|
菏泽市
|
陇南市
|
宜兴市
|
北碚区
|
米林县
|
苗栗县
|
岢岚县
|
额济纳旗
|
松阳县
|
潍坊市
|
体育
|
三原县
|
济南市
|
长宁区
|
张家川
|
堆龙德庆县
|
黄龙县
|
开化县
|
海原县
|
潜江市
|
南开区
|
荥经县
|
克什克腾旗
|
德庆县
|
化隆
|
鄂托克前旗
|
尉犁县
|
项城市
|
屯昌县
|
温宿县
|
三穗县
|