public abstract class FileLock
extends Object
implements AutoCloseable
java.lang.Object | |
↳ | java.nio.channels.FileLock |
表示文件区域上的锁定的令牌。
每次通过 FileChannel
类的 lock
或 tryLock
方法之一获取文件上的锁时,都会创建文件锁定对象
文件锁定对象最初是有效的。 它通过调用release
方法,关闭用于获取它的通道,或者通过终止Java虚拟机(以先到者为准)来释放锁之前,它仍然有效。 可以通过调用其isValid
方法来测试锁的有效性。
文件锁定是独占的还是共享的 。 共享锁可以防止其他并发运行的程序获取重叠排他锁,但确实允许它们获取重叠的共享锁。 排他锁可防止其他程序获取任一类型的重叠锁。 一旦它被释放,锁就不会对其他程序可能获取的锁产生进一步的影响。
通过调用isShared
方法可以确定锁是独占还是共享。 某些平台不支持共享锁,在这种情况下,共享锁请求会自动转换为独占锁请求。
单个Java虚拟机在特定文件上保留的锁不会重叠。 overlaps
方法可用于测试候选锁定范围是否与现有锁定重叠。
文件锁定对象记录锁定文件的文件通道,锁定的类型和有效性以及锁定区域的位置和大小。 只有锁的有效性随时间而变化; 锁状态的所有其他方面都是不可变的。
文件锁代表整个Java虚拟机。 它们不适用于控制同一虚拟机内多个线程对文件的访问。
该文件锁定API旨在直接映射到底层操作系统的本机锁定设施。 因此,无论文件写入的语言如何,锁定在文件上的锁都应该对所有有权访问该文件的程序都可见。
锁是否实际阻止另一个程序访问锁定区域的内容取决于系统,因此未指定。 某些系统的本地文件锁定功能仅仅是建议性的 ,这意味着程序必须协作观察已知的锁定协议以保证数据的完整性。 在其他系统上,本地文件锁定是强制性的 ,这意味着如果一个程序锁定文件的某个区域,则实际上阻止其他程序以违反该锁定的方式访问该区域。 在其他系统上,本机文件锁是建议性的还是强制性的,可以在每个文件的基础上进行配置。 为了确保跨平台的一致和正确的行为,强烈建议使用由此API提供的锁,就好像它们是咨询锁一样。
在某些系统上,获取文件区域上的强制锁定可防止该区域成为mapped into memory
,反之亦然。 应该准备结合了锁定和映射的程序,以防止这种组合失败。
在某些系统上,关闭通道会释放基础文件上Java虚拟机持有的所有锁,无论锁是通过该通道还是通过在同一文件上打开的另一个通道获取的。 强烈建议在程序中使用唯一通道来获取任何给定文件上的所有锁。
一些网络文件系统允许文件锁定与内存映射文件一起使用,只有当锁定区域是页面对齐的并且是底层硬件页面大小的整数倍时。 某些网络文件系统不会在延伸到特定位置的区域(通常为2 30或2 31)上实施文件锁定。 一般来说,锁定驻留在网络文件系统上的文件时应格外小心。
Protected constructors |
|
---|---|
FileLock(FileChannel channel, long position, long size, boolean shared) 初始化此类的新实例。 |
Public methods |
|
---|---|
Channel |
acquiredBy() 返回获取该锁的文件的频道。 |
final FileChannel |
channel() 返回获取此锁的文件的文件通道。 |
final void |
close() 此方法调用 |
final boolean |
isShared() 告诉这个锁是否共享。 |
abstract boolean |
isValid() 告诉这个锁是否有效。 |
final boolean |
overlaps(long position, long size) 告诉这个锁是否与给定的锁定范围重叠。 |
final long |
position() 返回锁定区域第一个字节文件中的位置。 |
abstract void |
release() 释放此锁。 |
final long |
size() 以字节为单位返回锁定区域的大小。 |
final String |
toString() 返回描述此锁的范围,类型和有效性的字符串。 |
Inherited methods |
|
---|---|
From class java.lang.Object
|
|
From interface java.lang.AutoCloseable
|
FileLock (FileChannel channel, long position, long size, boolean shared)
初始化此类的新实例。
Parameters | |
---|---|
channel |
FileChannel : The file channel upon whose file this lock is held |
position |
long : The position within the file at which the locked region starts; must be non-negative |
size |
long : The size of the locked region; must be non-negative, and the sum position + size must be non-negative |
shared |
boolean : true if this lock is shared, false if it is exclusive |
Throws | |
---|---|
IllegalArgumentException |
If the preconditions on the parameters do not hold |
Channel acquiredBy ()
返回获取该锁的文件的频道。
Returns | |
---|---|
Channel |
The channel upon whose file this lock was acquired. |
FileChannel channel ()
返回获取此锁的文件的文件通道。
该方法已被 acquiredBy
方法取代。
Returns | |
---|---|
FileChannel |
The file channel, or null if the file lock was not acquired by a file channel. |
void close ()
该方法调用release()
方法。 它被添加到类中,以便它可以与自动资源管理块结构一起使用。
Throws | |
---|---|
IOException |
boolean isShared ()
告诉这个锁是否共享。
Returns | |
---|---|
boolean |
true if lock is shared, false if it is exclusive |
boolean isValid ()
告诉这个锁是否有效。
锁对象保持有效,直到它被释放或关联的文件通道关闭为止,以先到者为准。
Returns | |
---|---|
boolean |
true if, and only if, this lock is valid |
boolean overlaps (long position, long size)
告诉这个锁是否与给定的锁定范围重叠。
Parameters | |
---|---|
position |
long
|
size |
long
|
Returns | |
---|---|
boolean |
true if, and only if, this lock and the given lock range overlap by at least one byte |
long position ()
返回锁定区域第一个字节文件中的位置。
一个锁定的区域不需要包含在实际的底层文件中,或者甚至不会重叠,所以此方法返回的值可能会超过文件的当前大小。
Returns | |
---|---|
long |
The position |
void release ()
释放此锁。
如果此锁定对象有效,则调用此方法将释放该锁定并将该对象呈现为无效。 如果此锁定对象无效,则调用此方法不起作用。
Throws | |
---|---|
ClosedChannelException |
If the channel that was used to acquire this lock is no longer open |
IOException |
If an I/O error occurs |
long size ()
以字节为单位返回锁定区域的大小。
一个锁定的区域不需要包含在实际的底层文件中,或者甚至不会重叠,所以此方法返回的值可能会超过文件的当前大小。
Returns | |
---|---|
long |
The size of the locked region |
String toString ()
返回描述此锁的范围,类型和有效性的字符串。
Returns | |
---|---|
String |
A descriptive string |