我有一个C++程序,它使用POSIX建议锁锁定文件。也就是说,它使用系统呼叫进行锁操作。我想要一个Java程序与那个C++程序进行互操作,所以我希望我的Java程序也使用POSIX咨询锁。Java 应该中的文件锁定使用标准的FileLock类。但是,可以理解的是,API文档对于如何实现锁定是模糊的:
此文件锁定API的目的是直接映射到底层操作系统的本机锁定工具。因此,对于所有访问该文件的程序来说,文件上的锁都应该是可见的,而不管这些程序是用什么语言编写的。
如果我在POSIX操作系统上运行Java的通用实现(Oracles,Open ),或者更具体地说是在GNU系统上运行,那么假设FileLock类使用POSIX咨询锁是安全的吗?
发布于 2014-05-12 12:46:32
一些Unix操作系统,包括Linux,提供了)锁,因此可以认为FileLock可以使用BSD样式的锁而不是POSIX锁来实现。但这是不可能的,因为BSD样式的锁是完整的文件锁,而不是记录锁,而FileLock是记录锁:每个锁用于文件中的字节范围。因此,在Unix系统上没有真正的选择,并且假设FileLock的实现使用POSIX fcntl锁在Unix操作系统上是一个安全的假设。
生成的FileLock锁可能与BSD样式的锁交互,也可能不与BSD风格的锁交互。BSD风格的锁可以使用POSIX锁(2.0版之前的Linux就是这种情况。)实现,或者操作系统可能具有两种类型的锁定交互(这就是FreeBSD的情况)。但是一般来说,这是不能保证的,而BSD样式的锁和Java锁可能实际上是彼此不可见的(对于您可能遇到的任何版本的Linux,都是这样的。)。
发布于 2014-05-09 12:26:19
试试这个:
(1)编写一个小型java程序,它锁定文件并休眠(或停止执行)。
(2) cat /proc/锁
(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之上的fcntl)。
如果java必须选择一个或另一个,那么POSIX将是明智的选择,因为它支持记录锁定。
https://stackoverflow.com/questions/23562369
复制相似问题