隨筆-204  評(píng)論-149  文章-0  trackbacks-0

          http://www.javaeye.com/topic/109150

          http://itchaser.javaeye.com/blog/440335

          http://www.javaeye.com/topic/11315


          還得了解一下Java內(nèi)存模型。。。

          看了一下Java虛擬機(jī)規(guī)范,就比較清楚了

          posted on 2009-06-28 00:50 Frank_Fang 閱讀(1156) 評(píng)論(5)  編輯  收藏 所屬分類: Java編程

          評(píng)論:
          # re: Java volatile關(guān)鍵字語義 2009-07-01 21:45 | Frank_Fang

          package test.thread.two;



          /**
           * 你會(huì)發(fā)現(xiàn)next( )和getValue( )都是synchronized。如果你只對(duì)其中一個(gè)做synchronized,那么另一個(gè)就被忽略了,于是其它線程就能肆無忌憚地調(diào)用它了。
           * 一定要記住:所有訪問共享資源的方法都必須是synchronized的,否則程序肯定會(huì)出錯(cuò)。
           * 而invariant( )倒不是synchronized的,這是因?yàn)樗枪y試線程用的,因此我們希望它能隨時(shí)被調(diào)用,只有這樣才能算是真正的測試。
           *
           
          */


          public class SynchronizedEvenGenerator implements Invariant {
              
              
          //不管加不加volatile都會(huì)發(fā)生沖突,只有將getValue()前加上synchronized才不會(huì)發(fā)生沖突
               private  volatile int i;

              
          public synchronized void next() {
                  i
          ++;
                  i
          ++;
              }


              
          //假如這個(gè)方法的synchronized去掉了,發(fā)生沖突是必然的
              
          //你可能聽說過,為了提高性能,在讀或?qū)懺訑?shù)據(jù)的時(shí)候,你應(yīng)該避免使用同步。
              //這個(gè)建議是非常危險(xiǎn)而錯(cuò)誤的

              public synchronized int getValue() {
                  
          return i;
              }


              
          // Not synchronized so it can run at
              
          // any time and thus be a genuine test:
              public InvariantState invariant() {
                  
          int val = getValue();
                  
          if (val % 2 == 0)
                      
          return new InvariantOK();
                  
          else
                      
          return new InvariantFailure(new Integer(val));
              }


              
          public static void main(String[] args) {
                  SynchronizedEvenGenerator gen 
          = new SynchronizedEvenGenerator();
                  
          new InvariantWatcher(gen, 4000); // 4-second timeout
                  while (true)
                      gen.next();
              }

          }

          原子操作

          "原子操作(atomic operation)是不需要synchronized",這是Java多線程編程的老生常談了。所謂原子操作是指不會(huì)被線程調(diào)度機(jī)制打斷的操作;這種操作一旦開始,就一直運(yùn)行倒結(jié)束,中間不會(huì)有任何context switch(切換到另一個(gè)線程)。

          通常所說的原子操作包括對(duì)非longdouble型的primitive進(jìn)行賦值,以及返回這兩者之外的primitive。之所以要把它們排除在外是因?yàn)樗鼈兌急容^大,而JVM的設(shè)計(jì)規(guī)范又沒有要求讀操作和賦值操作必須是原子操作(JVM可以試著去這么作,但并不保證)。不過如果你在longdouble前面加了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)論
            
          # re: Java 內(nèi)存模型及 volatile關(guān)鍵字語義 2009-07-21 01:56 | tt
          @Frank_Fang

          這段代碼在哪里?如何才可以運(yùn)行測試

          我在另外一個(gè)網(wǎng)站上看到的不是如此  回復(fù)  更多評(píng)論
            
          # re: Java 內(nèi)存模型及 volatile關(guān)鍵字語義 2009-07-21 01:57 | tt
          http://hi.baidu.com/lifa868/blog/item/22bc7718926ad772dbb4bd0e.html

          這里講的,即時(shí)非long及double也未必一會(huì)是原子的。。。
          還有代碼中說://不管加不加volatile都會(huì)發(fā)生沖突,只有將getValue()前加上synchronized才不會(huì)發(fā)生沖突

          會(huì)這樣么?  回復(fù)  更多評(píng)論
            
          # re: Java 內(nèi)存模型及 volatile關(guān)鍵字語義 2009-07-24 10:55 | Frank_Fang
          volatile保證了線程間變量的可見性,但是不保證能夠進(jìn)行互斥訪問
          synchronized保證對(duì)變量的互斥訪問,當(dāng)進(jìn)入或者退出synchronized代碼塊時(shí)會(huì)對(duì)將線程中的此本地變量副本(這個(gè)要區(qū)別TSD)寫到主存中,這也確保不同線程間對(duì)此變量的修改可見性
            回復(fù)  更多評(píng)論
            
          # re: Java 內(nèi)存模型及 volatile關(guān)鍵字語義 2009-09-04 10:59 | gee
          @Frank_Fang
          樓上正解  回復(fù)  更多評(píng)論
            
          主站蜘蛛池模板: 白水县| 会宁县| 凌源市| 湘乡市| 澎湖县| 贵阳市| 隆化县| 耒阳市| 九龙城区| 杭锦旗| 饶河县| 馆陶县| 芮城县| 长沙县| 南京市| 金秀| 涟源市| 金乡县| 浮山县| 新乡市| 正蓝旗| 万宁市| 浙江省| 子长县| 扎赉特旗| 岳池县| 手游| 肥东县| 聊城市| 子长县| 西吉县| 哈密市| 叶城县| 贵南县| 鞍山市| 尉犁县| 楚雄市| 确山县| 星子县| 丽水市| 庆城县|