<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-204  評論-149  文章-0  trackbacks-0

    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 | Frank_Fang

    package test.thread.two;



    /**
     * 你會發現next( )和getValue( )都是synchronized。如果你只對其中一個做synchronized,那么另一個就被忽略了,于是其它線程就能肆無忌憚地調用它了。
     * 一定要記住:所有訪問共享資源的方法都必須是synchronized的,否則程序肯定會出錯。
     * 而invariant( )倒不是synchronized的,這是因為它是供測試線程用的,因此我們希望它能隨時被調用,只有這樣才能算是真正的測試。
     *
     
    */


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

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


        
    //假如這個方法的synchronized去掉了,發生沖突是必然的
        
    //你可能聽說過,為了提高性能,在讀或寫原子數據的時候,你應該避免使用同步。
        //這個建議是非常危險而錯誤的

        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多線程編程的老生常談了。所謂原子操作是指不會被線程調度機制打斷的操作;這種操作一旦開始,就一直運行倒結束,中間不會有任何context switch(切換到另一個線程)。

    通常所說的原子操作包括對非longdouble型的primitive進行賦值,以及返回這兩者之外的primitive。之所以要把它們排除在外是因為它們都比較大,而JVM的設計規范又沒有要求讀操作和賦值操作必須是原子操作(JVM可以試著去這么作,但并不保證)。不過如果你在longdouble前面加了volatile,那么它就肯定是原子操作了。

    如果你一知半解地把這條規則用到SynchronizedEvenGenerator.java上,就會發覺:

    public synchronized int getValue() { return i; }

    好像很符合原子操作的定義嘛。但是把synchronized去掉試試看,程序很快就出了錯。這是因為,雖然return i是原子操作,但刪掉synchronized之后,別的線程就能在它還處于不穩定狀態的時候讀到它了。在做這種優化之前,先得真正弄懂這么做的后果是什么。這里沒有現成的經驗。

      回復  更多評論
      
    # re: Java 內存模型及 volatile關鍵字語義 2009-07-21 01:56 | tt
    @Frank_Fang

    這段代碼在哪里?如何才可以運行測試

    我在另外一個網站上看到的不是如此  回復  更多評論
      
    # re: Java 內存模型及 volatile關鍵字語義 2009-07-21 01:57 | tt
    http://hi.baidu.com/lifa868/blog/item/22bc7718926ad772dbb4bd0e.html

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

    會這樣么?  回復  更多評論
      
    # re: Java 內存模型及 volatile關鍵字語義 2009-07-24 10:55 | Frank_Fang
    volatile保證了線程間變量的可見性,但是不保證能夠進行互斥訪問
    synchronized保證對變量的互斥訪問,當進入或者退出synchronized代碼塊時會對將線程中的此本地變量副本(這個要區別TSD)寫到主存中,這也確保不同線程間對此變量的修改可見性
      回復  更多評論
      
    # re: Java 內存模型及 volatile關鍵字語義 2009-09-04 10:59 | gee
    @Frank_Fang
    樓上正解  回復  更多評論
      
    主站蜘蛛池模板: 亚洲A∨无码一区二区三区| 国产成人精品男人免费| 亚洲精品国精品久久99热一| 黄色三级三级免费看| 全部免费国产潢色一级| 亚洲av日韩av永久无码电影| 国产精品高清全国免费观看| 亚洲日韩在线中文字幕综合| 国产成人3p视频免费观看 | 午夜精品一区二区三区免费视频| 久久影视国产亚洲| 美女被免费网站91色| 亚洲av中文无码乱人伦在线播放| 久久99免费视频| 亚洲熟妇无码爱v在线观看| 2021久久精品免费观看| 亚洲欧美日本韩国| 国产午夜鲁丝片AV无码免费 | 一区二区视频在线免费观看| 国产成人99久久亚洲综合精品| 高清永久免费观看| 911精品国产亚洲日本美国韩国| 一二三四在线观看免费高清中文在线观看| 亚洲冬月枫中文字幕在线看 | 我要看WWW免费看插插视频| 亚洲国产成人AV网站| 亚洲色精品aⅴ一区区三区 | 日本特黄特色aa大片免费| 黄网站色视频免费看无下截 | 免费无码VA一区二区三区| 亚洲精品一区二区三区四区乱码 | MM1313亚洲国产精品| 亚洲男人在线无码视频| 99re免费在线视频| 亚洲国产精品美女久久久久| 国产亚洲色视频在线| 18禁超污无遮挡无码免费网站国产| 国产亚洲美女精品久久| 久久久亚洲欧洲日产国码二区| 日本高清免费aaaaa大片视频| 中文字幕无码日韩专区免费|