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变量不能被序列化保存。
时间: 2024-10-28 22:45:38