1

以下のような地図があります...

キー値 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) したがって、最小 =45 および最大 = 56 49 2
47 12

上記のように、値が 40 である split という名前の最終的な定数が存在します。

最終的な int SPLIT = 40; //これは、値を変更できるため、構成可能です。

したがって、マップの値が40に達した場合、計算が開始されたマップの最初のキーと、正確に40に達したキーが最小値と最大値として選択されるなどのロジックを実装する必要があります。

さらに、合計が 40 を超えた場合は無視し、前の値自体を最小値と最大値として取得する必要があります。この場合、最小値と最大値は等しくなります。

マップ内のJavaを介して同じことを達成する方法をアドバイスしてください

4

3 に答える 3

3

グローバルロックを必要としないように、アプリケーションを再設計します。システムを実装して、1つのJVMのみがロックを必要とし、他のすべてのJVMがシステムと通信して必要な処理を実行するようにします。

ServerSocket、ファイルロック、データロックを使用する多くの選択肢がありますが、私見では、これらを正しくまたは効率的に取得することははるかに困難です。

于 2012-08-26T06:56:21.717 に答える
0

異なるJVMスレッドではなく、異なるプロセス間で同期/通信するために使用される手法に依存する必要があります。このスレッドを見てください:Javaの共有メモリの概念

于 2012-08-26T06:56:34.380 に答える
0

それを利用できるフレームワークがいくつかあります
。一般に、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 コンテナーを使用)。

この方法では、アプリケーション コードは共有マップの内部実装を認識しません。

于 2012-08-26T16:05:37.533 に答える