不同Jvms之间的同步

时间:2012-08-26 06:48:18

标签: java multithreading

我有一张如下所示的地图......

关键价值     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实现相同的目标

3 个答案:

答案 0 :(得分:3)

我会重新设计你的应用程序,因此它不需要全局锁定。实现您的系统,这样只有一个JVM需要锁定,而每个其他JVM都与它进行对话,并且需要它。

有许多替代方案,使用ServerSocket,文件锁,数据锁,但恕我直言,这些更难以正确或有效。

答案 1 :(得分:0)

您将不得不依赖于用于在不同进程之间同步/通信的技术,而不是不同的JVM线程。 看一下这个主题:Any concept of shared memory in Java

答案 2 :(得分: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容器)。

这样,您的应用程序代码就不会知道共享映射的内部实现。