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