【问题标题】:Is a Java FileLock a POSIX advisory (fcntl) lockJava FileLock 是 POSIX 咨询 (fcntl) 锁吗
【发布时间】:2014-05-09 10:30:54
【问题描述】:

我有一个使用 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 咨询锁是否安全?

【问题讨论】:

  • 它有什么选择?
  • @EJP 另一种方法是使用 BSD flock 系统调用。使用fcntl 可能会或可能不会实现。
  • @EJP ...但仔细观察,我发现flock 不支持记录级锁定。
  • 还有"The flock(), fcntl(2), and lockf(3) locks are compatible"。所以这个问题没什么好说的了。
  • 除非最近发生了变化,否则flock 与 Linux 上的fcntl(和lockf)不兼容。这两者本质上是彼此看不见的。所以这个问题确实是有道理的。

标签: java linux posix file-locking fcntl


【解决方案1】:

试试这个:

(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 将是明智的选择,因为它支持记录锁定。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 2017-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-06-04
      • 2017-05-04
      相关资源
      最近更新 更多