我有一个加载地图的类(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语法,我只是编写代码来解释我的问题。
答案 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;
}
}
也可以访问此链接