总和的玩笑

下面的类计算并缓存了一个总和,并且在另一个类中打印这个总和       

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,初始化总和值的方法被执行了两次。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值