Java 为什么';t FileChannel.tryLock是否阻止跨多个进程访问?

Java 为什么';t FileChannel.tryLock是否阻止跨多个进程访问?,java,Java,可能重复: 在下面的代码中,我想测试FileLock类 import java.io.File; import java.nio.channels.*; import java.nio.MappedByteBuffer; import java.io.RandomAccessFile; class test{ File f= new File("./in.txt"); RandomAccessFile in = new RandomAccessFile(f, "rw");

可能重复:

在下面的代码中,我想测试
FileLock

import java.io.File;
import java.nio.channels.*;
import java.nio.MappedByteBuffer;
import java.io.RandomAccessFile;

class test{
    File f= new File("./in.txt");
    RandomAccessFile in = new RandomAccessFile(f, "rw");
    FileChannel fc = in.getChannel();

    byte[] t = new byte[20];
    in.read(t, 0, 8);
    System.out.println(new String(t));

    FileLock fl = fc.tryLock(0, 4, false);
    if(fl!=null){
        System.out.println("the file has been locked");
        Thread.sleep(10000);
        fl.release();
        System.out.println("no lock!");
    }
    fc.close();
    in.close();
    }
};
但问题是,当我运行“java测试”两次时,第一个应该将文件锁定在in.txt中,第二个不应该访问in.txt,然后不应该在屏幕上打印任何内容。但事实上,第二个也会在屏幕上打印字符串,尽管它会按预期返回。从0到第3字节的区域不应由其他人读取。但事实并非如此


但似乎有些不对劲。如果文件以独占方式锁定,则其他人无法访问该文件。但似乎不行。

FileLock在Linux下不起作用(至少不是我上次尝试的redhat)。编辑:那不是真的。我做错了:-)

在WindowsVista/7/8下,我上次尝试时它工作正常

也许有linux的文件系统实现可以做到这一点。您必须使用[file].lck临时文件的Creation来模拟锁定(尽管在file.create的文档中不建议这样做)


如果文件不存在,有一种特殊的原子方法来创建文件

FileLock在Linux下不起作用(至少不是我上次尝试的redhat)。编辑:那不是真的。我做错了:-)

在WindowsVista/7/8下,我上次尝试时它工作正常

也许有linux的文件系统实现可以做到这一点。您必须使用[file].lck临时文件的Creation来模拟锁定(尽管在file.create的文档中不建议这样做)


如果文件不存在,有一种特殊的原子方法来创建文件。我得到了一个
java.io.IOException:进程无法访问该文件,因为另一个进程锁定了文件的一部分,所以它阻止了读取。真的吗?你是怎么运作的?我打开两个终端,分别在UbuntuIt works下为其他人运行。在这两种情况下,您是从同一个目录运行它吗?请看这篇文章的答案:文件锁是由平台提供的,而不是由Java提供的。锁按规定工作。因此,这不是一个bug。我得到了这个
java.io.IOException:进程无法访问文件,因为另一个进程锁定了文件的一部分,所以它阻止了读取。真的吗?你是怎么运作的?我打开两个终端,分别在UbuntuIt works下为其他人运行。在这两种情况下,您是从同一个目录运行它吗?请看这篇文章的答案:文件锁是由平台提供的,而不是由Java提供的。锁按规定工作。因此,这不是一只虫子。