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) 所以这里 min = 45 和 max = 56 49 2
47 12

所以如上所示,将有一个名为 split 的最终常量,其值为 40

最终 int SPLIT = 40; //这将是可配置的,因为它的值可以更改。

所以我必须实现这样的逻辑,例如,如果地图的值达到 40,那么地图的第一个键从计算开始的地方开始,他的关键点恰好达到 40wilkl 被选为最小值和最大值,上面也解释了

除此之外,如果总和超过 40,我们必须忽略它,并将先前的值本身作为 min 和 max,在这种情况下 min 和 max 将相等。

请告知如何通过地图中的java实现相同的功能

4

3 回答 3

3

我会重新设计您的应用程序,使其不需要全局锁。实现您的系统,以便只有一个 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 回答