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

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

时间: 2024-10-28 22:45:38

static变量的线程间共享,进程间不共享的相关文章

在Windows系统上实现轻量级的线程间及进程间消息队列

看IaaS 资料时,捎带研究下硬件虚拟化,主要参考<基于intel VT-x 的Xen 全虚拟化实现>,<intel 开发手册 第三卷 19/20章> Intel VT 是intel X86架构的CPU硬件虚拟化技术,新增两种模式: VM root: 即虚拟机管理系统运行模式: VM non root:即虚拟机运行模式: 如下图: VMXON.VMXOFF用以实现打开或关闭虚拟化功能: VM Exit和VM Entry 用以实现non root和root之间的切换:这种转换被VMC

一个进程间同步和通讯的 C# 框架

转自原文 一个进程间同步和通讯的 C# 框架 threadmsg_demo.zip ~ 41KB    下载 threadmsg_src.zip ~ 65KB    下载 0.背景简介 微软在 .NET 框架中提供了多种实用的线程同步手段,其中包括 monitor 类及 reader-writer锁.但跨进程的同步方法还是非常欠缺.另外,目前也没有方便的线程间及进程间传递消息的方法.例如C/S和SOA,又或者生产者/消费者模式中就常常需要传递消息.为此我编写了一个独立完整的框架,实现了跨线程和跨

多进程进程间通讯multiprocessing

#!/usr/bin/env python # Author:Zhangmingda import queue,threading from multiprocessing import Process,Queue def f(q): q.put([234,None,'Hello']) if __name__ == '__main__': q = queue.Queue() #使用线程队列运行报错TypeError: can't pickle _thread.lock objects p = P

Paramics插件编程进程间通讯

一.进程间通讯 进程间的通讯,包括数据的交换与共享是一项实用的技术,多应用在大型系统中,一个大型的系统往往由多个程序部件组成,部件的形式是多种多样的,可以是动态链接库(DLL).Activex组件或控件,也可以是独立运行的程序.因此,在系统运行时各相关程序部件必然需要进行大量频繁的数据交换操作.动态链接库(DLL)与其主调应用程序之间的数据交换是非常容易实现的,但在两个应用程序之间,或是动态链接库与其主调应用程序之外的其他应用程序进行数据交换,就需要使用进程间通讯(interprocess co

同一进程间的线程共享资源

线程共享的环境包括: 1.进程代码段 2.进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯) 3.进程打开的文件描述符.信号的处理器.进程的当前目录和进程用户ID与进程组ID. 进程拥有这许多共性的同时,还拥有自己的个性.有了这些个性,线程才能实现并发性.这些个性包括: 1.线程ID      每个线程都有自己的线程ID,这个ID在本进程中是唯一的.进程用此来标识线程. 2.寄存器组的值      由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线

进程间同步(1)&mdash;&mdash;条件变量和互斥量

1. 概述 条件变量和互斥量是最基本的同步形式,总是用于同步同一个进程的各个线程间同步. 当把条件变量或互斥量放在共享内存区时,可用于进程间同步. 同样的情况还有读写锁,它们都是随进程的持续性.   2.互斥锁 互斥锁指代相互排斥,用于保护临界区.多个线程和多个进程分享的共享数据. 静态初始化:static pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; 动态初始化:互斥锁是动态分配的,pthread_mutex_init(&mutex);初始

C# 进程间共享内存通信方式

从别处看到一篇文章做进程间通信很好使,唯一的问题是,需要注意using的用法,Using有个用法3, using 语句允许程序员指定使用资源的对象应当何时释放资源.using 语句中使用的对象必须实现 IDisposable 接口.此接口提供了 Dispose 方法,该方法将释放此对象的资源. ①可以在 using 语句之中声明对象.     Font font2 = new Font("Arial", 10.0f);     using (font2)     {         /

进程间,线程间通信方式

一.进程间的通信方式 1 管道( pipe ):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有亲缘关系的进程间使用.进程的亲缘关系通常是指父子进程关系.2 有名管道 (namedpipe) : 有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间的通信.3 信号量(semophore ) : 信号量是一个计数器,可以用来控制多个进程对共享资源的访问.它常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源.因此,主要作为进程间以及同一进程内不同线程之间的同步手段.

Android系统匿名共享内存Ashmem(Anonymous Shared Memory)在进程间共享的原理分析

文章转载至CSDN社区罗升阳的安卓之旅,原文地址:http://blog.csdn.net/luoshengyang/article/details/6666491 在前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Shared Memory)驱动程序源代码分析中,我们系统地介绍了Android系统匿名共享内存的实现原理,其中着重介绍了它是如何辅助内存管理系统来有效地管理内存的,在再前面一篇文章Android系统匿名共享内存Ashmem(Anonymous Share