詩特林-sterning
posts - 310, comments - 6939, trackbacks - 0, articles - 3
BlogJava
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
Think in Java 4th--Java中的volatile
Posted on 2007-09-11 14:31
詩特林
閱讀(1728)
評論(2)
編輯
收藏
所屬分類:
Think In Java 4th
Think in Java 4th--Java中的volatile
我們知道,在Java中設置變量值的操作,除了long和double類型的變量外都是原子操作,也就是說,對于變量值的簡單讀寫操作沒有必要進行同步。
這在JVM 1.2之前,Java的內存模型實現總是從主存讀取變量,是不需要進行特別的注意的。而隨著JVM的成熟和優化,現在在多線程環境下volatile關鍵字的使用變得非常重要。
在當前的Java內存模型下,線程可以把變量保存在本地內存(比如機器的寄存器)中,而不是直接在主存中進行讀寫。這就可能造成一個線程在主存中修改了一個變量的值,而另外一個線程還繼續使用它在寄存器中的變量值的拷貝,造成數據的不一致。
要解決這個問題,只需要像在本程序中的這樣,把該變量聲明為volatile(不穩定的)即可,這就指示JVM,這個變量是不穩定的,每次使用它都到主存中進行讀取。一般說來,多任務環境下各任務間共享的標志都應該加volatile修飾。
Volatile修飾的成員變量在每次被線程訪問時,都強迫從共享內存中重讀該成員變量的值。而且,當成員變量發生變化時,強迫線程將變化值回寫到共享內存。這樣在任何時刻,兩個不同的線程總是看到某個成員變量的同一個值。
Java語言規范中指出:為了獲得最佳速度,允許線程保存共享成員變量的私有拷貝,而且只當線程進入或者離開同步代碼塊時才與共享成員變量的原始值對比。
這樣當多個線程同時與某個對象交互時,就必須要注意到要讓線程及時的得到共享成員變量的變化。
而volatile關鍵字就是提示VM:對于這個成員變量不能保存它的私有拷貝,而應直接與共享成員變量交互。
使用建議:在兩個或者更多的線程訪問的成員變量上使用volatile。當要訪問的變量已在synchronized代碼塊中,或者為常量時,不必使用。
由于使用volatile屏蔽掉了VM中必要的代碼優化,所以在效率上比較低,因此一定在必要時才使用此關鍵字。
請看如下示例:
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
回復
更多評論
2007-09-11 16:48 by
dennis
volatile需要強調的一點就是,它僅僅保證多線程環境下的可見性,不保證操作的原子性,舉的例子不大恰當吧,想更多了解還是看看這個帖子
http://www.javaeye.com/topic/109150
#
re: Think in Java 4th--Java中的volatile[未登錄]
回復
更多評論
2008-05-23 14:26 by
dd
簡單點就是線程在運行的時候為了提高效率所以被允許偷一點點懶,即忽視多線程的可能,不更新主存中的原本(線程使用的值是副本)。
VOLATILE即告訴JVM,不能偷懶!
這個特性應該是從C移植過來的。而C是沒有線程的,所以說,JAVA的線程其實做得很勉強。
因為從語義的角度講,線程的這種偷懶工作方式應該是不被允許的。JVM首先應該保證正確性(主存跟工作區的同步),然后再考慮性能優化。不正確的東西,性能再好也是白搭。
新用戶注冊
刷新評論列表
只有注冊用戶
登錄
后才能發表評論。
網站導航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
相關文章:
Thinking in Java 第四版(完全)及源代碼
Think in Java 4th--Java中的volatile
Powered by:
BlogJava
Copyright © 詩特林
日歷
<
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)
系統架構(7)
職場(2)
軟件測試(3)
項目管理(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)
相冊
書法
搜索
積分與排名
積分 - 1382687
排名 - 18
最新評論
1.?re: ORACLE directory 目錄
備份中使用到了,加油研究
--Glorin
2.?re: Struts2+Spring2+Hibernate3 web應用示例(七)
增刪改查 小白在學習中 樓主多多關照尼謝謝
--小石同學
3.?re: Struts2+Spring2+Hibernate3 web應用示例(七)
樓主 能不能把 Struts2+Spring2+Hibernate3工程都發我一份
960760087@qq.com 謝謝樓主
--小石同學
4.?re: 用Java實現FTP批量大文件上傳下載(六)--代碼及示例下載
樓主真大神, 我最近在做FTP批量下載圖片,但是遇到不少問題,如果能發一份源給我,我真的萬分感激 ,我的郵箱是450479001@qq.com
--啊謙
5.?re: Java做的酒店管理系統(C/S)源碼
可以麻煩樓主發一份給我嗎,最近在做這方面的作業,想學習學習,,謝謝樓主了!1587122459@qq.com
--肖敏
閱讀排行榜
1.?多線程Java Socket編程示例(92575)
2.?Java基于Socket文件傳輸示例(91392)
3.?Eclipse中最常用的10個快捷鍵(48738)
4.?用Java實現FTP批量大文件上傳下載(一)(41165)
5.?Struts2+Spring2+Hibernate3 web應用示例(一)(40722)
評論排行榜
1.?Java做的酒店管理系統(C/S)源碼(2300)
2.?基于WEB的批量大文件上傳下載技術共享(含源代碼)(988)
3.?系統分析師最新資料(720)
4.?Thinking in Java 第四版(完全)及源代碼(673)
5.?共享到底-軟件設計師(高級程序員)資料(264)
主站蜘蛛池模板:
久久精品亚洲日本佐佐木明希
|
亚洲天堂免费在线视频
|
中文字幕亚洲综合久久
|
大地资源网高清在线观看免费
|
久久精品国产亚洲5555
|
国产免费久久精品丫丫
|
国产国拍精品亚洲AV片
|
国产免费无码一区二区
|
久久精品7亚洲午夜a
|
午夜免费啪视频在线观看
|
一级毛片成人免费看a
|
亚洲av片一区二区三区
|
一级毛片a女人刺激视频免费
|
国产午夜免费高清久久影院
|
亚洲av色福利天堂
|
114级毛片免费观看
|
中国一级全黄的免费观看
|
亚洲中文字幕久久精品无码APP
|
国产老女人精品免费视频
|
成人免费视频试看120秒
|
日韩免费在线观看
|
亚洲精品色播一区二区
|
亚州免费一级毛片
|
在线精品亚洲一区二区
|
亚洲Av无码乱码在线znlu
|
国产高潮久久免费观看
|
久久亚洲精品成人AV
|
五月婷婷综合免费
|
青娱乐在线免费观看视频
|
久久九九亚洲精品
|
69堂人成无码免费视频果冻传媒
|
99久久99热精品免费观看国产
|
激情综合亚洲色婷婷五月APP
|
成年女人永久免费观看片
|
中文字幕乱码系列免费
|
亚洲一本之道高清乱码
|
亚洲精品国精品久久99热
|
免费观看激色视频网站bd
|
色偷偷亚洲第一综合
|
亚洲爆乳精品无码一区二区三区
|
4虎永免费最新永久免费地址
|