Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 不同JVM之间的同步_Java_Multithreading - Fatal编程技术网

Java 不同JVM之间的同步

Java 不同JVM之间的同步,java,multithreading,Java,Multithreading,我有一张这样的地图,如下所示 关键值 23 20 32 20(20+20=40,最小值=23,最大值=32) 43 18 45 24(24+18=42,因为42>40,所以这里的最小值和最大值与43相同 4710 566(24+10+6=40),所以这里最小值=45,最大值=56 492 47 12 如上所示,将有一个名为split的最终常量,其值为40 final int SPLIT=40;//这将是可配置的,因为它的值可以更改 所以我必须执行这样的逻辑,如果map的值达到

我有一张这样的地图,如下所示

关键值 23 20 32 20(20+20=40,最小值=23,最大值=32) 43 18 45 24(24+18=42,因为42>40,所以这里的最小值和最大值与43相同 4710
566(24+10+6=40),所以这里最小值=45,最大值=56 492
47 12

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

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

所以我必须执行这样的逻辑,如果map的值达到40 然后,选择地图的第一个键(从计算开始的位置开始)和精确到40KL的键(如上文所述)作为最小值和最大值

除此之外,需要注意的是,如果总和超过40,则我们必须忽略它,并将之前的值本身作为最小值和最大值,在这种情况下,最小值和最大值将相等


请建议如何通过map中的java实现同样的功能。我将重新设计您的应用程序,使其不需要全局锁。请实现您的系统,以便只有一个JVM需要锁,而其他JVM都会与它对话,以执行所需的操作


有很多替代方法,使用ServerSocket、文件锁、数据锁,但我认为这些方法更难做到正确或高效。

您必须依赖用于在不同进程之间进行同步/通信的技术,而不是不同的JVM线程。
看看这个帖子:

有几个框架可以帮你解决这个问题,
通常,您需要跨JVM使用共享数据结构(即集群)。
例如,我建议检查以下框架之一:
A、 -它为您提供共享数据网格,但也具有缓存(例如-驱逐策略)策略
B.-分布式缓存

我建议您确保应用程序与缓存/数据网格实现松散耦合—例如,使用以下方法:

Map<String,Integer> sharedJvmMap = SharedMapBuilderFactory.instance().getBuilder().createSharedMap();
Map sharedJvmMap=SharedMapBuilderFactory.instance().getBuilder().createSharedMap();
并具有为您创建共享地图的生成器层次结构。
构建器可以是这样的:

public interface SharedMapBuilder {
  <K,V> Map<K,V> createSharedMap();
}
公共接口SharedMapBuilder{
映射createSharedMap();
}
例如,该类有一个infinispan实现,并有一些配置文件定义您使用该生成器。
另一种选择是只注入适当的构建器(使用Spring、Juice或任何DI容器)


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

您有特定的工作场景吗?像这样讨论要比简单列出各种机制容易得多。