您的位置:首页 > 其它

关于static变量的线程间共享,进程间不共享

2012-09-12 22:56 411 查看
JAVA中通常我们会使用static域变量来在内存中缓存数据或长驻内存数据,众所周知

,static是类的所有实例所共享.


考虑一个问题,假如在多线程情况下,共享数据肯定会有危险的,

例如使用SimpleDateFormat工具的一个变量时,为方便作为util写为了static,后来

在几W条数据中会出现一个奇怪的日期,这就是在多线程下会出现问题导致的数据冲突,

一般这种能私有不共享的数据最好为一个实例一份拷贝,不要做为static

若非要做,就对象同步锁,使之单线程。

现在考虑的问题是,在进程间,static是否还是共享的?答案是否定的

其实道理很简单,就是我们在执行一个java程序的main方法是,是开启了一个进程来启动jvm执行该方法,执行完后进程结束,

你再次执行又开启一个进程,所以static变量没有共享;相当于开启一个进程来启动jvm,所以这里你的static变量是在线程间通过class对象来共享的,

而jvm一直开启,所以其装载的class对象也没有发生变化,当然static变量能够共享了。

但如果你关闭了服务器,结束该进程,则static不能留到下次启动服务器时还共享了,

这就相当于上面的运用普通java程序的main()方法一样。

那我们怎样在java下作到进程间的数据共享了,

一是可以把一些信息持久化,如保存到数据库、文件中;

另一种就是把对象序列化,它也可以做到在进程间的传递,如rmi、corba、jms都能在进程级别

下共享可序列化的对象,但又一点要注意就是类中的static变量不能被序列化保存
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: