欧美一级特黄大片做受成人-亚洲成人一区二区电影-激情熟女一区二区三区-日韩专区欧美专区国产专区

如何解決Java并發(fā)統(tǒng)計變量值偏差

這篇文章主要講解了如何解決Java并發(fā)統(tǒng)計變量值偏差,內(nèi)容清晰明了,對此有興趣的小伙伴可以學習一下,相信大家閱讀完之后會有幫助。

成都創(chuàng)新互聯(lián)專注于中大型企業(yè)的成都網(wǎng)站設計、網(wǎng)站建設和網(wǎng)站改版、網(wǎng)站營銷服務,追求商業(yè)策劃與數(shù)據(jù)分析、創(chuàng)意藝術與技術開發(fā)的融合,累計客戶上1000家,服務滿意度達97%。幫助廣大客戶順利對接上互聯(lián)網(wǎng)浪潮,準確優(yōu)選出符合自己需要的互聯(lián)網(wǎng)運用,我們將一直專注品牌網(wǎng)站設計和互聯(lián)網(wǎng)程序開發(fā),在前進的路上,與客戶一起成長!

1 問題描述

在一個項目中,需要對發(fā)送的請求結果進行統(tǒng)計,開發(fā)同事定義了兩個全局共享變量CommonUtil.ReqFailNum和ReqNum,分別記錄請求失敗數(shù)和發(fā)送的請求數(shù)。并在每次發(fā)送請求之前都假定該請求會處理失敗,先對其累加,直到成功收到200的返回碼后,重新修正失敗數(shù)量。

最后當應用處理請求處于較頻繁的階段時,出現(xiàn)了ReqFailNum最后減為負數(shù)的情況,一次正常請求完成時,

CommonUtil.ReqFailNum ++;和CommonUtil.ReqFailNum --應該是成對出現(xiàn)的,這個統(tǒng)計值不應該為負數(shù)的。

發(fā)送請求的代碼如下:

private static boolean XMLPost(String content, String sendUrl) throws Exception{
  boolean bn = false;
  
  if ( null != content ) {
      //初始假設請求發(fā)送失敗,等待正常返回200后再將失敗記錄數(shù)--
      CommonUtil.ReqFailNum ++;
      
      URL url =null;
      URLConnection con = null;
      OutputStreamWriter out = null;
      try {
        url = new URL(sendUrl);
        con = url.openConnection();
      }catch (MalformedURLException e1) {
        throw new ConnException("MalformedURLException");
      } catch (IOException e) {
        throw new ConnException("IOException");
      }
      con.setConnectTimeout(2000);
      con.setReadTimeout(2000);
      con.setDoOutput(true);
      con.setRequestProperty("Connection", "keep-alive");
      con.setRequestProperty("Pragma:", "no-cache");
      con.setRequestProperty("Cache-Control", "no-cache");
      con.setRequestProperty("Content-Type", "text/xml");
      
      try {
        out = new OutputStreamWriter(con.getOutputStream(), "UTF-8");
        out.write(content);
        out.flush();
        out.close();
      } catch (UnsupportedEncodingException e) {
        throw new ConnException("UnsupportedEncodingException");
      } catch (IOException e) {
        String exceptionStr = CommonUtil.stackTraceStr(e);
        throw new ConnException("IOException."+exceptionStr);
      }finally{
        try {
          if(out != null){
            out.close();
          }
        } catch (IOException e) {
          
          throw new ConnException("IOException...");
        }
      }
      
      String headline = con.getHeaderField(0);
      if (headline != null && headline.indexOf("200") > -1) {
        CommonUtil.ReqFailNum --;
        CommonUtil.ReqNum ++;
        bn = true;
        logger.info("sendUrl:: return 200 ok" );
      }
  }
  return bn;
}

2 錯誤原因分析  

統(tǒng)計變量在并發(fā)環(huán)境下,開發(fā)人員卻忽視了其安全問題。由于該方法在Action中調(diào)用,客戶端的每個請求,都會調(diào)用該方法。而Web服務器處理客戶端的請求時,對每個請求都創(chuàng)建了一個線程去處理。這段對統(tǒng)計變量操作的代碼,曝露在多線程環(huán)境下,卻沒有任何同步處理,很容易導致統(tǒng)計數(shù)據(jù)的不一致問題。

在這個應用中,ReqFailNum++這個操作實際上應該是一個原子操作,它包含了對內(nèi)存的三個動作“讀-修改-寫”,并且結果狀態(tài)依賴于之前的狀態(tài)。上述代碼,在沒有同步的情況下,當兩個線程同時執(zhí)行這行代碼時,可能讀到的是同一個值,同時+1 ,最終應該是兩次累計操作,結果只累加了一次,由于丟失了一次遞增操作,最終的統(tǒng)計值就偏差了1。

由于++代碼是方法最初的幾行,線程同時執(zhí)行++操作的概率較大,而CommonUtil.ReqFailNum --;是在請求成功處理完成后執(zhí)行的,這段時間涉及到網(wǎng)絡請求,處理時間不確定性較大,所以- -操作同時執(zhí)行的概率也較低。最終ReqFailNum++丟失的次數(shù)會多于ReqFailNum--丟失的次數(shù),從而導致這個共享變量ReqFailNum的值成了負數(shù)。

3 解決辦法  

1)使用鎖,將ReqFailNum++或--的操作放在同步代碼塊中

2)由于是簡單的統(tǒng)計變量,可以利用原子變量的特性,使用AtomicInteger或AtomicLong

結論:Web項目中,共享變量的線程安全性容易被忽視,加上數(shù)據(jù)不一致問題的出現(xiàn)具有偶發(fā)、不可預測等因素(本來想截個圖的,但是應用目前并發(fā)量小,沒有出現(xiàn)數(shù)據(jù)不一致的現(xiàn)象,這也是并發(fā)問題隱蔽而不易被發(fā)現(xiàn)的原因),為了防患于未然,在項目伊始就應該分析并發(fā)因素,讓開發(fā)人員關注可變狀態(tài)的線程安全性問題,是非常必要的。

看完上述內(nèi)容,是不是對如何解決Java并發(fā)統(tǒng)計變量值偏差有進一步的了解,如果還想學習更多內(nèi)容,歡迎關注創(chuàng)新互聯(lián)行業(yè)資訊頻道。

本文名稱:如何解決Java并發(fā)統(tǒng)計變量值偏差
網(wǎng)站網(wǎng)址:http://aaarwkj.com/article40/gjopeo.html

成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、企業(yè)網(wǎng)站制作App設計、微信小程序、網(wǎng)站制作、網(wǎng)站設計公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設
国产一边打电话一边操| av毛片在线观看地址| 精品国产乱码一区二区三区四区| 亚洲欧美一区二区粉嫩| 中文字幕在线感觉av| 凹凸69堂国产成人精品| 久久久国产精品调教网站| 亚洲av正片一区二区三区| 青青草老司机在线视频| 夜夜草视频在线免费观看| 理论三级麻豆国产在线| 亚洲av毛片在线免费| 国产亚洲欧美日韩激情在线| 国产成+人+综合+亚洲专区| 成年人正常性生活频率| 国产b片免费在线观看| 97久久精品人妻一区二区三区| 久久人体午夜激情视频| 欧美中文字幕在线精品| 麻豆看片高清在线播放| 免费成人自拍偷拍视频| 三欲一区二区三区中文字幕| 精品国产a级黄毛网站| 日韩在线视频一区二区三| 日韩精品中文字幕影视| 亚洲成人不卡一区二区三区| 日本一区二区三区不卡在线 | 青青草原一区在线观看| 亚洲精品国产第一区| 欧美国产大片一区视频| 91精品国产人妻女教师| 国产精品自偷自偷自偷| 日本成人在线播放网站| 亚洲a∨乱码一区二区三区蜜臀| 亚洲国产99在线精品一区| 日韩欧美在线一区二区| 日本精品动漫一区二区三区| 国产亚洲中文久久网久久| 九九热超在线视频精品| 亚洲国产99在线精品一区| 成人黄色动作片在线观看|