詩特林-sterning
posts - 310, comments - 6939, trackbacks - 0, articles - 3
BlogJava
::
首頁
::
新隨筆
::
聯系
::
聚合
::
管理
Think in Java 4th--Java中的volatile
Posted on 2007-09-11 14:31
詩特林
閱讀(1714)
評論(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)
相冊
書法
搜索
積分與排名
積分 - 1379818
排名 - 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編程示例(92558)
2.?Java基于Socket文件傳輸示例(91375)
3.?Eclipse中最常用的10個快捷鍵(48730)
4.?用Java實現FTP批量大文件上傳下載(一)(41151)
5.?Struts2+Spring2+Hibernate3 web應用示例(一)(40711)
評論排行榜
1.?Java做的酒店管理系統(C/S)源碼(2300)
2.?基于WEB的批量大文件上傳下載技術共享(含源代碼)(988)
3.?系統分析師最新資料(720)
4.?Thinking in Java 第四版(完全)及源代碼(673)
5.?共享到底-軟件設計師(高級程序員)資料(264)
主站蜘蛛池模板:
在线观看免费为成年视频
|
99在线精品视频观看免费
|
国产在线观看免费完整版中文版
|
亚洲av无码专区亚洲av不卡
|
免费看AV毛片一区二区三区
|
亚洲中文字幕无码mv
|
精品久久久久久久免费人妻
|
337P日本欧洲亚洲大胆精品
|
亚洲国产香蕉人人爽成AV片久久
|
人人公开免费超级碰碰碰视频
|
亚洲国产精品不卡毛片a在线
|
久久精品无码专区免费
|
久久综合图区亚洲综合图区
|
9277手机在线视频观看免费
|
亚洲乱码日产精品BD在线观看
|
最新中文字幕免费视频
|
国产91成人精品亚洲精品
|
亚洲无码视频在线
|
国产精品免费看久久久
|
免费看一级高潮毛片
|
久久国产成人亚洲精品影院
|
色www永久免费
|
亚洲伊人久久大香线蕉啊
|
亚洲欧洲∨国产一区二区三区
|
美女在线视频观看影院免费天天看
|
鲁丝片一区二区三区免费
|
亚洲成aⅴ人在线观看
|
日本一道高清不卡免费
|
丝袜捆绑调教视频免费区
|
亚洲成a人片毛片在线
|
免费观看午夜在线欧差毛片
|
a视频在线观看免费
|
亚洲sss综合天堂久久久
|
亚洲高清成人一区二区三区
|
国产情侣久久久久aⅴ免费
|
亚洲国产精品免费观看
|
亚洲精品线在线观看
|
日本不卡在线观看免费v
|
97无码人妻福利免费公开在线视频
|
亚洲人成777在线播放
|
日韩一卡2卡3卡4卡新区亚洲
|