posts - 10,comments - 2,trackbacks - 0

          下面的類計算并緩存了一個總和,并且在另一個類中打印這個總和       

          class Cache{

                       static {

                             initializeIfNecessary();

                        }

                    private static int sum;

                    public static int getSum(){

                          initializeIfNecessary();

                          return sum;

                     }

                   private static boolean initialized = false;

                  private static synchronized void initializeIfNecessary(){

                        if(!initialized){

                               for(int i=0;  i <  100;  i++  )

                                   sum+=i;

                              initialized = true;

                            }

                    }

                  }

           

          pubic class Client  {

              pubilc static void main(String[] args){

                      System.out.println(Cache.getSum());

             }

           }

          程序是一個典型的半開循環(huán),應(yīng)該打印出1到99的整數(shù)總和,即4950,但程序運行打印的為9900,是預(yù)期值的兩倍。

          程序在確保sum在使用之前就已經(jīng)初始化這個問題上,遇到了麻煩。程序結(jié)合了惰性初始化和積極初始化,還使用上了同步,以確保緩存在多線程環(huán)境下也能工作,但程序無法完成預(yù)期的工作。

          程序輸出打印是控制標志initialized 的問題。qq上一個朋友問的一本書里的問題,我也找到那本書了,是惰性初始化(static初始化)的問題,控制標志在static完成初始化后又重新被構(gòu)造器賦值為false,初始化總和值的方法被執(zhí)行了兩次。

          posted on 2007-09-06 09:58 皇馬嘯西風 閱讀(219) 評論(1)  編輯  收藏

          FeedBack:
          # re: 總和的玩笑
          2007-09-06 12:25 | 孫健
          長見識了!嘿
            回復(fù)  更多評論
            

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 措美县| 舒兰市| 綦江县| 乌鲁木齐县| 阳城县| 洞口县| 广宗县| 新野县| 望都县| 九台市| 修水县| 长沙县| 扶绥县| 县级市| 礼泉县| 蓝山县| 安化县| 闽清县| 北川| 轮台县| 兴宁市| 长宁区| 昌平区| 巴塘县| 青阳县| 海晏县| 济南市| 台北市| 诸城市| 焉耆| 江北区| 广平县| 大悟县| 兰州市| 阳高县| 胶州市| 确山县| 田林县| 贵港市| 榕江县| 桐梓县|