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

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

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

    Dev Zone
    偏執(zhí)狂才能生存,人生/事業(yè)的路上需要再堅(jiān)持一下
    但是又怎么說(shuō)得清堅(jiān)持的結(jié)果,道得盡堅(jiān)持的含義
    Ofbiz2.1有兩個(gè)bug,都涉及到線(xiàn)程安全性,小并發(fā)的時(shí)候不容易發(fā)現(xiàn),大并發(fā)下有時(shí)候會(huì)出現(xiàn),并發(fā)數(shù)越高出現(xiàn)的頻度就比較高,尤其對(duì)于實(shí)體引擎的那個(gè)bug,在系統(tǒng)初始化的時(shí)候如果遭遇大并發(fā),會(huì)有一定頻度的出現(xiàn)。
     
    1。entity engine的ModelEntity.getField方法存在線(xiàn)程安全隱患,會(huì)造成 XXXX is not a field of XXX的異常,以下是原有代碼片斷:

        
    public ModelField getField(String fieldName) {
            
    if (fieldName == nullreturn null;
            if (fieldsMap == null) {
                fieldsMap = new HashMap(fields.size());
                for (int i = 0; i < fields.size(); i++) {
                    ModelField field = (ModelField) fields.get(i);
                    fieldsMap.put(field.name, field);
            }
            return (ModelField) fieldsMap.get(fieldName);
        }

    由于getField方法沒(méi)有同步(會(huì)造成性能下降),因此紅色標(biāo)標(biāo)注的那段代碼存在線(xiàn)程安全問(wèn)題,必須進(jìn)行同步。在大并發(fā)下如果多個(gè)調(diào)用這個(gè)方法,最先調(diào)用的線(xiàn)程沒(méi)有執(zhí)行完循環(huán)的情況下,后續(xù)的線(xiàn)程通過(guò)最后的語(yǔ)句return的時(shí)候得到的就是Null(fieldsMap已經(jīng)被第一個(gè)線(xiàn)程賦值了,后續(xù)線(xiàn)程不會(huì)進(jìn)入紅色標(biāo)準(zhǔn)的代碼區(qū)域)。
    修改后的代碼如下:
       public ModelField getField(String fieldName) {
            
    if (fieldName == nullreturn null;
            
    if (fieldsMap == null) {
                 createFields();
            }
            
    return (ModelField) fieldsMap.get(fieldName);
        }

        
    public synchronized void createFields()
        {
                 fieldsMap 
    = new HashMap(fields.size());
     
                 
    for (int i = 0; i < fields.size(); i++) {
                     ModelField field 
    = (ModelField) fields.get(i);
     
                     fieldsMap.put(field.name, field);
                 }
        }
     
    這個(gè)Bug在3.0中已經(jīng)被修正。
     
    2。UtilCache.get方法同樣存在線(xiàn)程安全隱患,會(huì)造成LinkedList.remove或者LinedList.addFirst的空值針異常,不注意還會(huì)以為是LinkedList的bug。以下是原代碼片斷:
        public Object get(Object key) {
            
    if (key == null) {
                missCount
    ++;
                
    return null;
            }
            UtilCache.CacheLine line 
    = (UtilCache.CacheLine) cacheLineTable.get(key);
            
    if (hasExpired(line)) {
                
    // note that print.info in debug.properties cannot be checked through UtilProperties here, it would cause infinite recursion
                
    // if (Debug.infoOn()) Debug.logInfo("Element has expired with key " + key);
                remove(key);
                line 
    = null;
            }
            
    if (line == null) {
                
    // if (Debug.infoOn()) Debug.logInfo("Element not found with key " + key);
                missCount++;
                
    return null;
            }
            
    // if (Debug.infoOn()) Debug.logInfo("Element found with key " + key);
            hitCount++;
            if (maxSize > 0) {
                keyLRUList.remove(key);
                keyLRUList.addFirst(key);
            }

            return line.getValue();
        }
    紅色標(biāo)準(zhǔn)的部分是有問(wèn)題的代碼,修改后的代碼如下:
        public Object get(Object key) {
            
    if (key == null) {
                missCount
    ++;
                
    return null;
            }
            UtilCache.CacheLine line 
    = (UtilCache.CacheLine) cacheLineTable.get(key);
            
    if (hasExpired(line)) {
                
    // note that print.info in debug.properties cannot be checked through UtilProperties here, it would cause infinite recursion
                
    // if (Debug.infoOn()) Debug.logInfo("Element has expired with key " + key);
                remove(key);
                line 
    = null;
            }
            
    if (line == null) {
                
    // if (Debug.infoOn()) Debug.logInfo("Element not found with key " + key);
                missCount++;
                
    return null;
            }
            
    // if (Debug.infoOn()) Debug.logInfo("Element found with key " + key);
            hitCount++;
            
    if (maxSize > 0) {
                synchronized ( 
    this)
                {
                     keyLRUList.remove(key);
                     keyLRUList.addFirst(key);
                }
            }
            
    return line.getValue();
        }

    這個(gè)BUG在3.0種也修正了。
    posted on 2005-05-17 22:07 dev 閱讀(313) 評(píng)論(0)  編輯  收藏

    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: 亚洲码和欧洲码一码二码三码| 在线观看免费精品国产| 久久久国产精品福利免费| 香蕉国产在线观看免费| 午夜毛片不卡高清免费| 一个人看www在线高清免费看| 1000部拍拍拍18勿入免费视频软件| 久久亚洲免费视频| 99免费在线观看视频| 青青草97国产精品免费观看| 日本一区二区在线免费观看| 久久国产乱子伦精品免费午夜 | 亚洲嫩模在线观看| 亚洲AV福利天堂一区二区三| 久久99亚洲网美利坚合众国| 亚洲国产亚洲片在线观看播放| 亚洲一级高清在线中文字幕| 亚洲性无码一区二区三区| 日韩色视频一区二区三区亚洲| 色费女人18女人毛片免费视频| 亚洲a级片在线观看| 亚洲人成人无码.www石榴 | 亚洲精品无码专区在线在线播放| 国产偷v国产偷v亚洲高清| 91天堂素人精品系列全集亚洲 | 成人免费的性色视频| 好男人视频社区精品免费| 啊v在线免费观看| 亚洲色欲色欲www在线丝| 精品日韩亚洲AV无码一区二区三区| 亚洲成a人片在线看| 高潮内射免费看片| 久久精品国产影库免费看| 在线看片免费不卡人成视频 | 免费阿v网站在线观看g| 日本特黄a级高清免费大片| 久久伊人亚洲AV无码网站| 亚洲综合久久综合激情久久| 亚洲国产成人手机在线观看 | 亚洲色成人网站WWW永久四虎 | 一级毛片**免费看试看20分钟|