【问题标题】:Synchronization among different Jvms不同JVM之间的同步
【发布时间】:2012-08-26 06:48:18
【问题描述】:

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

键值 23 20 32 20 (20+20 =40 , 最小=23 最大=32) 43 18 45 24 (24+18 =42 ,因为 42 >40 所以这里的最小值和最大值将相同,即 43 47 10
56 6 (24 +10 +6 =40) 所以这里 min = 45 和 max = 56 49 2
47 12

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

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

所以我必须实现逻辑,例如如果地图的值达到 40 然后地图的第一个键从计算开始的位置和精确到 40 的键被选为最小值和最大值,上面也解释了

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

请指教如何通过java in map实现同样的效果

【问题讨论】:

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

标签: java multithreading


【解决方案1】:

我会重新设计您的应用程序,使其不需要全局锁。实现您的系统,以便只有一个 JVM 需要锁,而其他所有 JVM 都会与其进行对话以执行所需的操作。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      有几个框架可以为您解决这个问题,
      通常,您需要使用跨 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 容器)。

      这样,您的应用程序代码将不知道共享地图的内部实现。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-04
        • 2013-02-13
        • 1970-01-01
        • 2013-10-23
        • 1970-01-01
        相关资源
        最近更新 更多