如何通过两个不同的java进程创建一个类的单个实例

时间:2014-06-06 04:47:53

标签: java unix map jar

我有一个加载地图的类(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语法,我只是编写代码来解释我的问题。

5 个答案:

答案 0 :(得分:0)

将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类,然后它应该解决你的目的..

答案 1 :(得分:0)

这比你想要的更难!

如果您想以这种方式共享对象,那么最好的方法是使用线程而不是进程。获得Java based scheduler such as Quartz在线程之间进行调度比使IPC在两个Java进程之间工作更容易。

如果您必须使用两个不同的流程,那么您将不得不进行IPC。两个Java进程无法共享内存(不包括一些JNI极端情况)。这将为您提供诸如RMI,命名管道,共享文件,套接字等方法......

答案 2 :(得分:0)

  

此地图由两个并行运行的作业使用

     

...通过进程 ...

您正在使用"流程"在OS意义上,对吗?不,你不能像那样在JVM实例之间共享对象。

这听起来像是一个共享缓存,所以你可能最好使用Memcached并让第一个进程加载"锁定,"然后初始化它。

答案 3 :(得分:0)

并发初始化的一种模式是枚举。另一个是内部类(因为它保证在第一次使用时加载内部类)。

必须调整用法,因为不再使用静态字段。

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可确保线程安全修改。

答案 4 :(得分:0)

您可以将MapLoader作为单例类

来完成此操作
public class MapLoader {

    private static MapLoader map;



    public static MapLoader getInstance(){
        if(map== null){
            map= new MapLoader ();
        }
        return map;
    }
}

也可以访问此链接