package io;
//: io/LockingMappedFiles.java
// Locking portions of a mapped file.
// {RunByHand}
import java.nio.*;
import java.nio.channels.*;
import java.io.*;
public class LockingMappedFiles {
static final int LENGTH = 0xA00000; // 10 MB
static FileChannel fc;
public static void main(String[] args) throws IOException {
fc = new RandomAccessFile("test.dat", "rw").getChannel();
MappedByteBuffer mbb = fc
.map(FileChannel.MapMode.READ_WRITE, 0, LENGTH);
for (int i = 0; i < LENGTH; i++) {
mbb.put((byte) 'x');
}
new LockAndModify(mbb, 0, 0 + LENGTH/3);
new LockAndModify(mbb, LENGTH/2, LENGTH/2+LENGTH/4);
}
public static class LockAndModify extends Thread {
int start;
int end;
ByteBuffer bbf;
public LockAndModify(ByteBuffer mbb, int start, int end) {
this.start = start;
this.end = end;
mbb.limit(end);
mbb.position(start);
bbf = mbb.slice();
start();
}
@Override
public void run() {
try {
FileLock fl = fc.lock(start, end, false);
System.out.println("Locked " + start + "to " + end);
while(bbf.position() < bbf.limit()-1){
//put方法会增加position的值
bbf.put((byte)(bbf.get()+2));
}
fl.release();
System.out.println("release " + start + "to " + end);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
} // /:~
对映射文件的部分加锁
最新推荐文章于 2025-11-12 12:02:38 发布
2421

被折叠的 条评论
为什么被折叠?



