关于Java文件锁的一个疑问?

在学习NIO时候,有一段描述:

文件锁定以整个Java虚拟机来保持。但它们不适用于控制同一虚拟机内多个线程对文件的访问。

这是什么意思?

public class Test01 {

    public static void main(String[] args) {
        try {
            RandomAccessFile fileA = new RandomAccessFile("/Users/mac/tmp/abc", "rw");
            FileChannel fileChannelA = fileA.getChannel();
            FileLock lock = fileChannelA.lock(0, 1, true);
            lock.release();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
阅读 2k
1 个回答
// **_Locks are associated with files, not channels. Use locks to coordinate with external processes, not between threads in the same JVM._**

锁是与文件相关的,而不是Channel。
用于跟外部进程协调,而不是在同一JVM中的线程之间;
所以也就是说, 一个应用运行期间, 如果lock了, 另外再启动一个应用访问同一个文件, 是锁定的;
但是这个锁, 与同一个应用中的多个线程无关;

核心词:

  1. lock与文件相关
  2. 跟外部进程协调(注意不是内部线程)
"锁定"这个概念, 用来隔离的不是thread, 而是进程;就比如你用java实现了两个NIO的软件,一个取名叫"画图", 一个取名叫"PS"; 这时你打开“画图”打开一个照片 a.jpg, lock了; 再打开"PS", 打开这个 a.jpg是被锁定的;
但是呢, 这个lock不是管理你“画图”应用中多个线程的协调, 它不干这个!!就是你提到的“不适用于”

所以其实这句话是讲这个FileLock的用途是隔离一个文件在进程之间的争抢;不是隔离一个文件在进程内多个线程的竞争的!

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题