Java FileLock是一个POSIX顾问(fcntl)锁

Rae*_*ald 3 java linux posix file-locking fcntl

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

此文件锁定API旨在直接映射到底层操作系统的本机锁定工具.因此,无论编写这些程序的语言如何,所有可以访问该文件的程序都可以看到文件中保存的锁.

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

Duc*_*uck 5

尝试这个:

(1)编写一个小的Java程序,该程序将锁定文件并进入休眠状态(否则将停止执行)。

(2)猫/ proc /锁

(3)您将看到类似以下的行:

24: POSIX  ADVISORY  READ  1784 08:01:27384070 1073742826 1073742335
25: FLOCK  ADVISORY  WRITE 815  00:0f:9772     0          EOF
Run Code Online (Sandbox Code Playgroud)

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

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


Rae*_*ald 5

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

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