关于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变量不能被序列化保存
,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变量不能被序列化保存
相关文章推荐
- 关于static变量的线程间共享,进程间不共享
- 关于进程和线程对于全局变量共享的问题学习总结
- 关于进程和线程对于全局变量共享的问题学习总结
- 探究Python多进程编程下线程之间变量的共享问题
- 关于进程共享变量#pragma data_seg用法
- 【进程线程与同步】5.4 System.Threading.Interlocked 为多个线程共享的变量提供原子操作
- 【进程线程与同步】5.4 System.Threading.Interlocked 为多个线程共享的变量提供原子操作
- 同一进程中的不同线程,他们读取到同个共享变量的值为什么会不一致
- 关于进程的所有资源被个线程共享的分析
- 关于线程、进程之间的数据共享
- 线程不安全的类不要轻易做为static变量使用,及如何使用ThreadLocal将共享变量变为独享变量
- 探究Python多进程编程下线程之间变量的共享问题
- 关于程序,进程,线程。程序个人理解:应用程序是一个车间,进程是一条生产线,线程是机器
- fork调用后,子进程与父进程是否共享变量
- 关于进程和线程『整理』
- FAQ3:关于Dll注入之后共享段与非共享段变量的疑惑?
- 统一进程的线程能共享的内容
- 关于linux内核中多进程(线程)间同步和互斥
- 线程高级应用-心得3-线程范围内的共享变量以及应用场景及面试题案例分析
- 同一进程下线程共享的数据和独有的数据