http://www.javaeye.com/topic/109150
http://itchaser.javaeye.com/blog/440335
http://www.javaeye.com/topic/11315
還得了解一下Java內(nèi)存模型。。。
看了一下Java虛擬機規(guī)范,就比較清楚了
http://www.javaeye.com/topic/109150
http://itchaser.javaeye.com/blog/440335
http://www.javaeye.com/topic/11315
還得了解一下Java內(nèi)存模型。。。
看了一下Java虛擬機規(guī)范,就比較清楚了
"原子操作(atomic operation)是不需要synchronized",這是Java多線程編程的老生常談了。所謂原子操作是指不會被線程調(diào)度機制打斷的操作;這種操作一旦開始,就一直運行倒結(jié)束,中間不會有任何context switch(切換到另一個線程)。
通常所說的原子操作包括對非long和double型的primitive進行賦值,以及返回這兩者之外的primitive。之所以要把它們排除在外是因為它們都比較大,而JVM的設(shè)計規(guī)范又沒有要求讀操作和賦值操作必須是原子操作(JVM可以試著去這么作,但并不保證)。不過如果你在long或double前面加了volatile,那么它就肯定是原子操作了。
如果你一知半解地把這條規(guī)則用到SynchronizedEvenGenerator.java上,就會發(fā)覺:
public synchronized int getValue() { return i; }
好像很符合原子操作的定義嘛。但是把synchronized去掉試試看,程序很快就出了錯。這是因為,雖然return i是原子操作,但刪掉synchronized之后,別的線程就能在它還處于不穩(wěn)定狀態(tài)的時候讀到它了。在做這種優(yōu)化之前,先得真正弄懂這么做的后果是什么。這里沒有現(xiàn)成的經(jīng)驗。
回復(fù) 更多評論只有注冊用戶登錄后才能發(fā)表評論。 | ||
![]() |
||
網(wǎng)站導(dǎo)航:
博客園
IT新聞
Chat2DB
C++博客
博問
管理
|
||
相關(guān)文章:
|
||