簡體   English   中英

不同Jvms之間的同步

[英]Synchronization among different Jvms

我有這樣的地圖,如下所示......

關鍵值23 20 32 20(20 + 20 = 40,min = 23 max = 32)43 18 45 24(24 + 18 = 42,因為42> 40所以這里min和max將是相同的43 47 10
56 6(24 +10 +6 = 40)所以這里min = 45,max = 56 49 2
47 12

如上所示,將有一個名為split的最終常量,其值為40

final int SPLIT = 40; //這將是可配置的,因為它可以更改值。

因此,我必須強調邏輯,例如,如果地圖的值達到40,那么計算開始的地圖的第一個關鍵字和他確切到達40wilkl的關鍵字將被選擇為min和max也在上面解釋

除了這種關注需要采取\\和如果總和達到40以上那么我們必須忽略它並將前一個值本身作為min amd max,在最小情況下min和max將是相等的。

請告知如何通過java在地圖中實現相同的目標

我會重新設計你的應用程序,因此它不需要全局鎖定。 實現您的系統,因此只有一個JVM需要鎖定,並且每個其他JVM與它進行對話即可完成所需操作。

有許多替代方案,使用ServerSocket,文件鎖,數據鎖,但恕我直言這些更難以獲得正確或有效。

您將不得不依賴於用於在不同進程之間同步/通信的技術,而不是不同的JVM線程。 看一下這個線程: Java中共享內存的任何概念

有幾個框架可以為您服務,
通常,您需要跨JVM使用共享數據結構(即 - 集群)。
我建議舉例來檢查以下框架之一:
A. Infinispan - 為您提供共享數據網格,但也有緩存(例如 - 驅逐策略)策略
B. EHCache - 分布式緩存

我建議你確保你的應用程序與緩存/數據網格實現松散耦合 - 例如使用這種方法:

Map<String,Integer> sharedJvmMap = SharedMapBuilderFactory.instance().getBuilder().createSharedMap();

並有一個構建器層次結構,為您創建共享映射。
構建器可以看起來像:

public interface SharedMapBuilder {
  <K,V> Map<K,V> createSharedMap();
}

舉例來說,這個類的infinispan實現,並有一些配置文件定義您使用此構建器。
另一個選擇是注入適當的構建器(使用Spring,Juice或任何DI容器)。

這樣,您的應用程序代碼就不會知道共享映射的內部實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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