[英]How can we initiate two instances of same Java class in two different processes?
[英]How to create single instance of a class by two different java processes
我有一个类(MapLoader)加载地图。
public class MapLoader{
statci Map aMap;
static{
//does some processing to load this map
}
该图由两个并行运行的不同作业使用。 这些作业是unix批处理作业,它调用两个不同的jar文件。
Jar 1:
public class ABC{
public static void main(String args[]){
//uses MapLoader.aMap
}
Jar 2:
public class XYZ{
public static void main(String args[]){
//uses MapLoader.aMap
}
这些jar文件使用MapLoader类的映射。
有没有办法通过两个进程仅创建一个MapLoader实例 。 请提示。
**请忽略Java语法(如果有的话),我只是编写了解释我的问题的代码。
将您的MapLoader作为单例类:
private static MapLoader ml;
public static MapLoader create ()
{
if (ml==null)
{
ml=new MapLoader ();
}
return (ml);
}
创建一个新类,在其中创建一个MapLoader实例:
class OneInstance
{
public static returnOneInstance()
{
MapLoader mapLoader = MapLoader.create();
};
现在,在ABC和XYZ类中扩展OneInstance类,然后它应该可以解决您的目的。
该图由两个并行运行的不同作业使用
通过这两个过程
您是从操作系统的角度使用“进程”,对吗? 不,您不能像这样在JVM实例之间共享对象。
这听起来像是共享缓存,所以最好使用Memcached并让第一个进程加载“锁”,然后对其进行初始化。
并发初始化的一种模式是枚举。 另一个是内部类(因为可以保证在首次使用时加载内部类)。
由于不再可以使用静态字段,因此必须调整用法。
public enum MapLoader {
INSTANCE;
public Map aMap;
{
//does some processing to load this map
aMap = new ConcurrentHashMap();
}
}
volatile aMap = MapLoader.INSTANCE.aMap;
这将创建一个单例。 我个人通常将共享实例传递给其构造函数中的每个线程,或依靠某个容器(如Web应用程序)来提供单例。
具有现场volatile
的线程保证它不仅复制到线程,但在每次访问更新。
ConcurrentHashMap确保线程安全的修改。
您可以通过将MapLoader作为单例类来完成此操作
public class MapLoader {
private static MapLoader map;
public static MapLoader getInstance(){
if(map== null){
map= new MapLoader ();
}
return map;
}
}
也访问此链接
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.