代码之家  ›  专栏  ›  技术社区  ›  LB40

锁定多个JVM?

  •  5
  • LB40  · 技术社区  · 15 年前

    这与 this question .

    我用make提取一些关于C程序的信息。我用一个运行我的Java程序和GCC的BASH脚本来包装编译。基本上,我在做:

    make CC=~/my_script.sh
    

    我想用几个工作(-j选项与make)。它根据依赖规则运行多个进程。

    如果我理解得很好,我会拥有和乔布斯一样多的JVM实例,对吗?

    问题是我正在使用sqlite jdb收集一些信息。所以问题是如何避免多个进程同时修改数据库? 似乎sqlite锁依赖于jvm(我的意思是一个锁只能在锁定的jvm中“看到”),对于randomaaccessfile.lock()也是如此。

    你知道怎么做吗?(创建一个tmp文件,然后查看它是否存在似乎是一种可能性,但可能很昂贵。数据库中的锁定表?)

    谢谢

    3 回复  |  直到 15 年前
        1
  •  9
  •   Michael Borgwardt    15 年前

    java.nio.channels.FileLock 允许操作系统级跨进程文件锁定。

    然而,在调用gcc之前,使用make启动一个并行运行几个JVM的bash脚本对我来说太过鲁莽和脆弱。

        2
  •  4
  •   Omry Yadan    15 年前

    有几种解决办法。 如果您的锁应该在同一台机器内,您可以使用服务器套接字来实现它(管理绑定到端口的进程首先拥有锁,其他进程等待端口可用)。

    如果需要跨多台计算机的锁,可以使用memcached锁。这需要 memcached 服务器正在运行。如果您对这个解决方案感兴趣,我可以粘贴一些代码。

    可以让Java库连接到MycChank here .

        3
  •  1
  •   Grzegorz Oledzki    15 年前

    你可以试试 Terracotta 用于在不同的JVM实例之间共享对象。对于你的需求来说,这似乎是一个过于沉重的解决方案,但至少值得考虑。