package com.alimama.mdrill.utils; import java.io.File; import java.io.RandomAccessFile; import java.nio.channels.FileChannel; import java.nio.channels.FileLock; import java.nio.channels.OverlappingFileLockException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class TryLockFile { public static Logger log = LoggerFactory.getLogger(TryLockFile.class); String localpath = null; FileLock flout = null; RandomAccessFile out = null; FileChannel fcout = null; public TryLockFile(String stopath) { super(); this.localpath = stopath; } public void trylock() { try{ File file = new File(localpath); if (!file.exists()) { file.createNewFile(); } out = new RandomAccessFile(file, "rw"); fcout = out.getChannel(); for(int i=0;i<10000;i++) { try { flout = fcout.lock(); break; }catch(OverlappingFileLockException e){ Thread.sleep(300); } } }catch(Throwable e) { log.error("trylock",e); } } protected void finalize() throws Throwable { super.finalize(); this.unlock(); } public void unlock() { try { if (flout != null) { flout.release(); flout=null; } if (fcout != null) { fcout.close(); fcout=null; } if (out != null) { out.close(); out = null; } } catch (Exception e) { log.error("unlock",e); } } }