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());

   }

 }

程序是一个典型的半开循环,应该打印出1到99的整数总和,即4950,但程序运行打印的为9900,是预期值的两倍。

程序在确保sum在使用之前就已经初始化这个问题上,遇到了麻烦。程序结合了惰性初始化和积极初始化,还使用上了同步,以确保缓存在多线程环境下也能工作,但程序无法完成预期的工作。

程序输出打印是控制标志initialized 的问题。qq上一个朋友问的一本书里的问题,我也找到那本书了,是惰性初始化(static初始化)的问题,控制标志在static完成初始化后又重新被构造器赋值为false,初始化总和值的方法被执行了两次。

posted on 2007-09-06 09:58 皇马啸西风 阅读(212) 评论(1)  编辑  收藏

FeedBack:
# re: 总和的玩笑
2007-09-06 12:25 | 孙健
长见识了!嘿
  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问