我有一个使用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建议锁?
答案 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将是明智的选择,因为它支持记录锁定。