锁定几个jvm?

时间:2009-09-21 13:38:21

标签: java locking makefile

这与this question有点相关。

我正在使用make来提取有关某些C程序的一些信息。我正在使用运行我的java程序然后gcc的bash脚本包装编译。基本上,我在做:

make CC=~/my_script.sh

我想使用几个作业(-j选项和make)。它根据依赖规则运行了几个进程。

如果我理解得很好,我会将jvm的实例作为工作,对吗?

问题是我正在使用sqlite-jdb来收集一些信息。那么问题是如何避免几个进程同时尝试修改db? 似乎sqlite锁是jvm依赖的(我的意思是一个锁只能在锁定jvm中“看到”),并且这对于RandomAccessFile.lock()来说是相同的。

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

感谢

3 个答案:

答案 0 :(得分:9)

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

然而,在调用gcc声音之前,使用make来启动一个并行运行多个JVM的bash脚本,这对Rube-Goldbergian来说也很脆弱。

答案 1 :(得分:4)

有几个解决方案。 如果你的锁应该在同一台机器上,你可以使用服务器套接字来实现它(设法绑定到端口的进程首先拥有锁,其他进程等待端口变为可用)。

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

您可以让Java库连接到memcached here

答案 2 :(得分:1)

您可以尝试Terracotta在各种JVM实例之间共享对象。对于您的需求而言,它可能看起来太过沉重,但至少值得考虑。