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提供的。锁按规定工作。因此,这不是一只虫子。