[英]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.