http://www.javaeye.com/topic/109150
http://itchaser.javaeye.com/blog/440335
http://www.javaeye.com/topic/11315
還得了解一下Java內存模型。。。
看了一下Java虛擬機規范,就比較清楚了
posted on 2009-06-28 00:50
Frank_Fang 閱讀(1154)
評論(5) 編輯 收藏 所屬分類:
Java編程
評論:
# re: Java volatile關鍵字語義
2009-07-01 21:45 |
原子操作
"原子操作(atomic operation)是不需要synchronized",這是Java多線程編程的老生常談了。所謂原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行倒結束,中間不會有任何context switch(切換到另一個線程)。
通常所說的原子操作包括對非long和double型的primitive進行賦值,以及返回這兩者之外的primitive。之所以要把它們排除在外是因為它們都比較大,而JVM的設計規范又沒有要求讀操作和賦值操作必須是原子操作(JVM可以試著去這么作,但并不保證)。不過如果你在long或double前面加了volatile,那么它就肯定是原子操作了。
如果你一知半解地把這條規則用到SynchronizedEvenGenerator.java上,就會發覺:
public synchronized int getValue() { return i; }
好像很符合原子操作的定義嘛。但是把synchronized去掉試試看,程序很快就出了錯。這是因為,雖然return i是原子操作,但刪掉synchronized之后,別的線程就能在它還處于不穩定狀態的時候讀到它了。在做這種優化之前,先得真正弄懂這么做的后果是什么。這里沒有現成的經驗。
回復 更多評論
# re: Java 內存模型及 volatile關鍵字語義
2009-07-21 01:56 |
@Frank_Fang
這段代碼在哪里?如何才可以運行測試
我在另外一個網站上看到的不是如此
回復 更多評論
# re: Java 內存模型及 volatile關鍵字語義
2009-07-21 01:57 |
# re: Java 內存模型及 volatile關鍵字語義
2009-07-24 10:55 |
volatile保證了線程間變量的可見性,但是不保證能夠進行互斥訪問
synchronized保證對變量的互斥訪問,當進入或者退出synchronized代碼塊時會對將線程中的此本地變量副本(這個要區別TSD)寫到主存中,這也確保不同線程間對此變量的修改可見性
回復 更多評論
# re: Java 內存模型及 volatile關鍵字語義
2009-09-04 10:59 |