这与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中的锁定表?)
感谢
答案 0 :(得分:9)
java.nio.channels.FileLock
允许操作系统级跨进程文件锁定。
然而,在调用gcc声音之前,使用make来启动一个并行运行多个JVM的bash脚本,这对Rube-Goldbergian来说也很脆弱。
答案 1 :(得分:4)
有几个解决方案。 如果你的锁应该在同一台机器上,你可以使用服务器套接字来实现它(设法绑定到端口的进程首先拥有锁,其他进程等待端口变为可用)。
如果您需要跨越多台计算机的锁,则可以使用memcached锁。这将需要运行memcached服务器。如果您对此解决方案感兴趣,我可以粘贴一些代码。
您可以让Java库连接到memcached here。
答案 2 :(得分:1)
您可以尝试Terracotta在各种JVM实例之间共享对象。对于您的需求而言,它可能看起来太过沉重,但至少值得考虑。