import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.RandomAccessFile; import java.nio.ByteBuffer; import java.nio.MappedByteBuffer; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.util.concurrent.TimeUnit; public class Test { public static void main(String[] args){ // FileLocking.test(); LockingmappedFiles.test(); } } class FileLocking { public static void test() { try { FileOutputStream out = new FileOutputStream("temp.tmp"); FileLock fl = out.getChannel().tryLock(); if (fl != null) { System.out.println("Locked File"); TimeUnit.SECONDS.sleep(100); fl.release(); System.out.println("Released Lock"); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (InterruptedException e) { e.printStackTrace(); } } } class LockingmappedFiles { private static final int LENGTH = 0X8000000; //128MB private static FileChannel fc; public static void test() { try { fc = new RandomAccessFile("test.data", "rw") .getChannel(); MappedByteBuffer out = fc .map(FileChannel.MapMode.READ_WRITE, 0, LENGTH); for (int i = 0; i < LENGTH; i++) { out.put((byte)'c'); } new LockAndModify(out, 0, 0 + LENGTH / 3); new LockAndModify(out, LENGTH / 2, LENGTH / 2 + LENGTH / 4); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } private static class LockAndModify extends Thread { private ByteBuffer buff; private int start,end; public LockAndModify(ByteBuffer bb, int start, int end) { this.start=start; this.end=end; //这段写法学习下 bb.limit(end); bb.position(start); buff = bb.slice(); start(); } public void run() { try { FileLock fl = fc.lock(start, end, false); System.out.println("Locked:"+start+" to "+end); while (buff.position() < buff.limit() - 1) { buff.put((byte)(buff.get()+1)); } fl.release(); System.out.println("Released:"+start+" to "+end); } catch (IOException e) { e.printStackTrace(); } } } }