JavaFileLock是一个POSIX顾问(fcntl)锁

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

这个文件lockingAPI旨在直接映射到底层操作系统的本机locking工具。 因此,无论程序写入的语言如何,文件上的锁应该对所有有权访问该文件的程序都可见。

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

Solutions Collecting From Web of "JavaFileLock是一个POSIX顾问(fcntl)锁"

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

生成的FileLock锁可能会或可能不会与BSD风格的锁进行交互。 BSD风格的锁可以使用POSIX锁来实现( 2.0之前Linux就是这种情况 ),或者操作系统可能有两种锁定方式( FreeBSD就是这种情况 )。 但总的来说,这是无法保证的,而BSD风格的锁和Java锁可能对彼此是不可见的( 对于任何版本的Linux,您都可能遇到这种情况 )。

尝试这个:

(1)编写一个锁定文件并睡觉的小型java程序(或以其他方式停止执行)。

(2)cat / 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(或在fcntl之上构建的lockf )。

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