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

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变量不能被序列化保存

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值