java中关于static的一个小问题

本文探讨了Java程序中Static变量的共享原理。在独立Java程序与部署于服务器的WAR包应用中,Static变量的生命周期及共享方式存在显著差异。文章详细解释了进程与线程环境下Static变量的行为表现。

转摘自:http://blog.youkuaiyun.com/mshust2006/article/details/1428318

        今天突然想到前几天思考的一个问题,就是我们通常在一个war包(或是别的j2ee的程序包)为了提升性能,采用了一些“缓存”来存储一些开销比较大的资源,这样使用它们时就会节省很多new的时间,这些“缓存”我们通常用static型的变量来做,我们知道一个类的多个对象间是共享一个static型变量的,但问题在于这些是在war包中,如果我们是在一个普通的java程序中定义的一个static变量,每次执行同一个类的main()方法来调用该变量却没有达到共享的目的,这是为什么了?
       其实道理很简单,就是我们在执行一个java程序的main方法是,是开启了一个进程来启动jvm执行该方法,执行完后进程结束,你再次执行又开启一个进程,所以static变量没有共享;而在war包中是,你启动服务器装载这个war包,相当于开启一个进程来启动jvm,同时启动了服务器来运行这个war包,以后你的操作容器会生成一个线程来做,所以这里你的static变量是在线程间通过class对象来共享的,而jvm一直开启,所以其装载的class对象也没有发生变化,当然static变量能够共享了。但如果你关闭了服务器,结束该进程,则static不能留到下次启动服务器时还共享了,这就相当于上面的运用普通java程序的main()方法一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值