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

时间:2014-05-09 10:30:54

标签: java linux posix file-locking fcntl

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

  

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

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

2 个答案:

答案 0 :(得分:5)

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

生成的FileLock锁可能会或可能不会与BSD样式的锁交互。可以使用POSIX锁(this was the case for Linux before version 2.0)实现BSD样式的锁,或者操作系统可能具有两种锁定交互方式(this is the case for FreeBSD)。但总的来说,无法保证,BSD风格的锁和Java锁可能彼此实际上不可见(this is the case for any version of Linux you are likely to encounter)。

答案 1 :(得分:4)

试试这个:

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

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