获取此通道的文件给定区域上的锁定。
在可以锁定该区域、已关闭此通道或者已中断调用线程(以先到者为准)之前,将阻塞此方法的调用。
如果在此方法调用期间另一个线程关闭了此通道,则抛出 asynchronouscloseexception
。
如果在等待获取锁定的同时中断了调用线程,则将状态设置为中断并抛出 filelockinterruptionexception
。如果调用此方法时已设置调用方的中断状态,则立即抛出该异常;不更改该线程的中断状态。
由 position 和 size 参数所指定的区域无需包含在实际的底层文件中,甚至无需与文件重叠。锁定区域的大小是固定的;如果某个已锁定区域最初包含整个文件,并且文件因扩大而超出了该区域,则该锁定不覆盖此文件的新部分。如果期望文件大小扩大并且要求锁定整个文件,则应该锁定从零开始,到不小于期望最大文件大小的区域。零参数的 lock()
方法只是锁定大小为 long.max_value
的区域。
某些操作系统不支持共享锁定,在这种情况下,自动将对共享锁定的请求转换为对独占锁定的请求。可通过调用所得锁定对象的 isshared
方法来测试新获取的锁定是共享的还是独占的。
文件锁定是以整个 java 虚拟机来保持的。但它们不适用于控制同一虚拟机内多个线程对文件的访问。
- 参数:
position
- 锁定区域开始的位置;必须为非负数size
- 锁定区域的大小;必须为非负数,并且 position + size 的和必须为非负数shared
- 要请求共享锁定,则为 true,在这种情况下此通道必须允许进行读取(可能是写入)操作;要请求独占锁定,则为 false,在这种情况下此通道必须允许进行写入(可能是读取)操作
- 返回:
- 一个锁定对象,表示新获取的锁定
- 抛出:
illegalargumentexception
- 如果关于参数的前提不成立
closedchannelexception
- 如果此通道已关闭
asynchronouscloseexception
- 如果调用线程阻塞于此方法中时另一个线程关闭了此通道
filelockinterruptionexception
- 如果调用线程阻塞于此方法中时被中断
overlappingfilelockexception
- 如果此 java 虚拟机已经持有与所请求区域重叠的锁定,或者如果另一个线程已阻塞于此方法中并且正在试图锁定一个重叠区域
nonreadablechannelexception
- 如果 shared 为 true,但此通道不允许进行读取操作
nonwritablechannelexception
- 如果 shared 为 false,但此通道不允许进行写入操作
ioexception
- 如果发生其他 i/o 错误- 另请参见:
lock()
,
trylock()
,
trylock(long,long,boolean)