模块 java.base

类 FileLock

java.lang.Object
java.nio.channels.FileLock
所有已实现的接口:
AutoCloseable

public abstract class FileLock extends Object implements AutoCloseable
表示对文件区域的锁定的标记。

每次通过 FileChannel 类的 lock tryLock 方法或 AsynchronousFileChannel 类的 lock tryLock 方法之一获取文件锁时,都会创建一个文件锁对象。

文件锁对象最初是有效的。在通过调用 release 方法、通过关闭用于获取它的通道或通过终止 Java 虚拟机(以先发生者为准)释放锁之前,它一直有效。可以通过调用其 isValid 方法来测试锁的有效性。

文件锁是独家的或者共享.共享锁可防止其他并发运行的程序获取重叠排它锁,但允许它们获取重叠共享锁。独占锁可防止其他程序获取任一类型的重叠锁。一旦释放,锁就不会对其他程序可能获取的锁产生进一步的影响。

锁是独占锁还是共享锁可以通过调用其 isShared 方法来确定。有些平台不支持共享锁,此时请求共享锁会自动转换为请求独占锁。

单个 Java 虚拟机对特定文件持有的锁不会重叠。 overlaps 方法可用于测试候选锁范围是否与现有锁重叠。

一个文件锁对象记录了文件被锁定的文件通道、锁定的类型和有效性,以及被锁定区域的位置和大小。只有锁的有效性会随时间发生变化;锁状态的所有其他方面都是不可变的。

文件锁代表整个 Java 虚拟机持有。它们不适合控制同一虚拟机中多个线程对文件的访问。

文件锁对象可以安全地供多个并发线程使用。

平台依赖

此文件锁定 API 旨在直接映射到底层操作系统的本机锁定功能。因此,文件上的锁应该对所有有权访问该文件的程序可见,而不管这些程序是用什么语言编写的。

锁是否真的阻止另一个程序访问锁定区域的内容是系统相关的,因此是未指定的。某些系统的本机文件锁定功能仅仅是咨询,这意味着程序必须合作遵守已知的锁定协议以保证数据完整性。在其他系统上,本机文件锁是强制的,这意味着如果一个程序锁定文件的一个区域,那么实际上会阻止其他程序以违反锁定的方式访问该区域。在其他系统上,本机文件锁是建议性的还是强制性的,可以在每个文件的基础上进行配置。为确保跨平台的行为一致且正确,强烈建议将此 API 提供的锁当作建议锁来使用。

在某些系统上,获取文件区域的强制锁定可防止该区域成为 mapped into memory ,反之亦然。组合锁定和映射的程序应该为这种组合失败做好准备。

在某些系统上,关闭通道会释放 Java 虚拟机在底层文件上持有的所有锁,而不管这些锁是通过该通道获取的还是通过在同一文件上打开的另一个通道获取的。强烈建议在程序中使用唯一通道来获取任何给定文件上的所有锁。

某些网络文件系统仅在锁定区域页面对齐且底层硬件页面大小时的整数倍时才允许将文件锁定与内存映射文件一起使用。某些网络文件系统不会对超出特定位置的区域实现文件锁定,通常 230或 231.通常,锁定驻留在网络文件系统上的文件时应格外小心。

自从:
1.4
  • 构造方法总结

    构造方法
    修饰符
    构造方法
    描述
    protected
    FileLock(AsynchronousFileChannel channel, long position, long size, boolean shared)
    初始化此类的新实例。
    protected
    FileLock(FileChannel channel, long position, long size, boolean shared)
    初始化此类的新实例。
  • 方法总结

    修饰符和类型
    方法
    描述
    返回获取此锁的文件所在的通道。
    返回在其文件上获取此锁的文件通道。
    final void
    此方法调用 release() 方法。
    final boolean
    告知此锁是否共享。
    abstract boolean
    告知此锁是否有效。
    final boolean
    overlaps(long position, long size)
    告知此锁是否与给定的锁范围重叠。
    final long
    返回锁定区域的第一个字节在文件中的位置。
    abstract void
    释放这个锁。
    final long
    size()
    以字节为单位返回锁定区域的大小。
    final String
    返回描述此锁的范围、类型和有效性的字符串。

    在类 java.lang.Object 中声明的方法

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
  • 构造方法详细信息

    • FileLock

      protected FileLock(FileChannel  channel, long position, long size, boolean shared)
      初始化此类的新实例。
      参数:
      channel - 持有此锁的文件通道
      position - 文件中锁定区域开始的位置;必须是非负的
      size - 锁定区域的大小;必须是非负的,和 position + size 必须是非负的
      shared - true 如果此锁是共享的,false 如果是独占的
      抛出:
      IllegalArgumentException - 如果参数的先决条件不成立
    • FileLock

      protected FileLock(AsynchronousFileChannel  channel, long position, long size, boolean shared)
      初始化此类的新实例。
      参数:
      channel - 持有此锁的文件的通道
      position - 文件中锁定区域开始的位置;必须是非负的
      size - 锁定区域的大小;必须是非负的,和 position + size 必须是非负的
      shared - true 如果此锁是共享的,false 如果是独占的
      抛出:
      IllegalArgumentException - 如果参数的先决条件不成立
      自从:
      1.7
  • 方法详情

    • channel

      public final FileChannel  channel()
      返回在其文件上获取此锁的文件通道。

      此方法已被 acquiredBy 方法取代。

      返回:
      文件通道,或者 null 如果文件锁不是由文件通道获取的。
    • acquiredBy

      public Channel  acquiredBy()
      返回获取此锁的文件所在的通道。
      返回:
      获取此锁的文件所在的通道。
      自从:
      1.7
    • position

      public final long position()
      返回锁定区域的第一个字节在文件中的位置。

      锁定区域不需要包含在实际基础文件中,甚至不需要与实际基础文件重叠,因此此方法返回的值可能会超过文件的当前大小。

      返回:
      职位
    • size

      public final long size()
      以字节为单位返回锁定区域的大小。

      锁定区域不需要包含在实际基础文件中,甚至不需要与实际基础文件重叠,因此此方法返回的值可能会超过文件的当前大小。

      返回:
      锁定区域的大小
    • isShared

      public final boolean isShared()
      告知此锁是否共享。
      返回:
      true 如果锁是共享的,false 如果是独占的
    • overlaps

      public final boolean overlaps(long position, long size)
      告知此锁是否与给定的锁范围重叠。
      参数:
      position - 锁定范围的起始位置
      size - 锁定范围的大小
      返回:
      true 如果这个锁和给定的锁范围重叠至少一个字节; false 如果 size 为负或锁定范围不与此锁定重叠
    • isValid

      public abstract boolean isValid()
      告知此锁是否有效。

      锁对象一直有效,直到它被释放或关联的文件通道关闭,以先到者为准。

      返回:
      true 当且仅当此锁有效
    • release

      public abstract void release() throws IOException
      释放这个锁。

      如果此锁定对象有效,则调用此方法会释放锁定并使对象无效。如果此锁定对象无效,则调用此方法无效。

      抛出:
      ClosedChannelException - 如果用于获取此锁的通道不再打开
      IOException - 如果发生 I/O 错误
    • close

      public final void close() throws IOException
      此方法调用 release() 方法。它被添加到类中,以便它可以与自动资源管理块构造结合使用。
      指定者:
      close 在接口 AutoCloseable
      抛出:
      IOException
      自从:
      1.7
    • toString

      public final String  toString()
      返回描述此锁的范围、类型和有效性的字符串。
      重写:
      toString 在类 Object
      返回:
      描述性字符串