5

我有一个 C++ 程序,它使用 POSIX 咨询锁来锁定文件。也就是说,它使用POSIXfcntl系统调用进行锁定操作。我想要一个 Java 程序与那个 C++ 程序互操作,所以我希望我的 Java 程序也使用 POSIX 咨询锁。Java 中的文件锁定应该使用标准FileLock类。但是 API 文档对于锁定的实现方式含糊不清,这是可以理解的:

此文件锁定 API 旨在直接映射到底层操作系统的本机锁定设施。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的。

如果我在 POSIX 操作系统,或更具体地说是 GNU/Linux 系统上运行 Java(Oracles,Open JDK)的通用实现,假设 JavaFileLock类使用 POSIX 咨询锁是否安全?

4

2 回答 2

5

试试这个:

(1) 编写一个小java程序,锁定一个文件并休眠(或以其他方式停止执行)。

(2) 猫 /proc/locks

(3) 您将看到如下所示的行:

24: POSIX  ADVISORY  READ  1784 08:01:27384070 1073742826 1073742335
25: FLOCK  ADVISORY  WRITE 815  00:0f:9772     0          EOF

从第 5 列中识别您的进程 ID。如果第 2 列是 FLOCK,则flock正在使用。如果是 POSIX,那么第 2 列将是 POSIX,表示正在使用fcntl(或lockf构建在 之上)。fcntl

如果 java 必须选择其中一个,那么 POSIX 将是明智的选择,因为它支持记录锁定。

于 2014-05-09T12:26:19.387 回答
5

包括 Linux 在内的一些 Unix 操作系统提供BSD 样式 ( flock) 锁,因此可能认为 JavaFileLock可以使用 BSD 样式锁而不是POSIX 锁来实现。但这是不可能的,因为 BSD 风格的锁是整个文件锁而不是记录锁,并且 FileLock是一个记录锁:每个锁都针对文件中的一个字节范围。因此在 Unix 系统上没有真正的选择,并且假设FileLock使用 POSIXfcntl锁的实现在 Unix 操作系统上是一个安全的假设。

The resulting FileLock locks might or might not interact with BSD-style locks. BSD-style locks can be implemented using POSIX locks (this was the case for Linux before version 2.0), or the operating system might have the two styles of locking interact (this is the case for FreeBSD). But in general that can not be guaranteed, and BSD-style locks and Java locks might be effectively invisible to each other (this is the case for any version of Linux you are likely to encounter).

于 2014-05-12T12:46:32.033 回答