簡體   English   中英

如何通過兩個不同的Java進程創建類的單個實例

[英]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類,然后它應該可以解決您的目的。

這將比您想要的要難!

如果您希望以這種方式共享對象,那么最好的方法是使用線程而不是進程。 與使IPC在兩個Java進程之間工作相比,讓Quartz這樣的基於Java的調度程序在線程之間進行調度要容易得多。

如果必須使用兩個不同的過程,則必須進行IPC。 兩個Java進程不能共享內存(某些JNI極端情況除外)。 這給您留下了諸如RMI,命名管道,共享文件,套接字等方法。

該圖由兩個並行運行的不同作業使用

通過這兩個過程

您是從操作系統的角度使用“進程”,對嗎? 不,您不能像這樣在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM