生活随笔
收集整理的這篇文章主要介紹了
JAVA文件锁
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
項(xiàng)目使用到集群環(huán)境,流程發(fā)送時(shí)如果確保一個(gè)流程不會(huì)被兩個(gè)流程同時(shí)調(diào)用?
有一種辦法是用文件鎖的方式來(lái)實(shí)現(xiàn)。
代碼如下:
鎖接口:
Java代碼??
package?lock;?? ?? import?java.io.FileNotFoundException;?? import?java.io.IOException;?? ?? public?interface?Lock?{?? ?? ????? ? ? ?? ????public?abstract?boolean?isLocked()?throws?FileNotFoundException;?? ?? ????? ? ? ?? ????public?abstract?boolean?obtain()?throws?IOException;?? ?? ????? ? ?? ????public?abstract?void?unlock();?? ?? }??
?
?
文件鎖的實(shí)現(xiàn):
Java代碼??
package?lock;?? ?? import?java.io.File;?? import?java.io.FileNotFoundException;?? import?java.io.IOException;?? import?java.io.RandomAccessFile;?? import?java.nio.channels.FileChannel;?? import?java.nio.channels.FileLock;?? import?java.nio.channels.OverlappingFileLockException;?? ?? public?class?FileProgrameLock?implements?Lock{?? ????private?String?callerThreadID?=?null;?? ????private?String?lockFileName?=?null;?? ????FileChannel?channel?=?null;?? ????private?FileLock?lock?=?null;?? ?????? ????public?static?Lock?get(String?fileName,String?callerThreadID){?? ????????FileProgrameLock?d?=?new?FileProgrameLock(fileName);?? ????????d.callerThreadID?=?callerThreadID;?? ????????return?(Lock)d;?? ????}?? ?????? ????public?FileProgrameLock(String?lockFileName){?? ????????this.lockFileName?=?lockFileName;?? ????}?? ?????? ????? ? ? ? ?? ????public?boolean?isLocked()?throws?FileNotFoundException?{?? ????????File?tf?=?new?File(lockFileName);?? ????????if(?!?tf.exists()){?? ????????????return?false;?? ????????}?? ????????FileChannel?__channel?=?new?RandomAccessFile(tf,?"rw").getChannel();?? ????????FileLock?tl?=?null;?? ????????try?{?? ????????????tl?=?__channel.tryLock();?? ????????????if?(tl?==?null)?{?? ????????????????return?true;?? ????????????}?else?{?? ?????????????????? ????????????????return?false;?? ????????????}?? ????????}?catch?(OverlappingFileLockException?e)?{?? ????????????return?true;?? ????????}?catch?(IOException?e)?{?? ????????????return?true;?? ????????}catch?(Exception?e)?{?? ????????????return?true;?? ????????}finally{?? ????????????try?{?? ????????????????if(tl?!=?null){?? ????????????????????tl.release();?? ????????????????}?? ????????????????tl?=?null;?? ????????????????if(__channel.isOpen()){?? ????????????????????__channel.close();?? ????????????????}?? ????????????????__channel?=?null;?? ????????????????tf?=?null;?? ????????????}?catch?(IOException?e)?{?? ????????????????e.printStackTrace();?? ????????????}?? ?????????????? ????????}?? ????}?? ?? ????? ? ? ?? ????public?boolean?obtain()?throws?IOException?{?? ????????File?tf?=?new?File(lockFileName);?? ????????createFile();?? ????????channel?=?new?RandomAccessFile(tf,?"rw").getChannel();?? ????????try?{?? ?? ????????????lock?=?channel.lock();?? ?? ????????????return?true;?? ????????}?catch?(OverlappingFileLockException?e)?{?? ????????????return?false;?? ????????}catch?(Exception?e)?{?? ????????????return?false;?? ????????}?? ????}?? ?? ????? ? ?? ????public?void?unlock()?{?? ????????try?{?? ????????????if(lock?!=?null){?? ????????????????lock.release();?? ????????????}?? ????????????System.out.println(callerThreadID?+?"?unlock?XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX?");?? ????????????if(channel?!=?null?&&?channel.isOpen()){?? ????????????????channel.close();?? ????????????}?? ????????????lock?=?null;?? ????????????channel?=?null;?? ????????????this.deleteFile();?? ????????}?catch?(IOException?e)?{?? ????????}?? ????}?? ?????? ????protected?void?finalize()?throws?Throwable?{?? ????????System.out.println(callerThreadID?+?this.getClass()?+?"?.finalize()");?? ????????super.finalize();?? ????}?? ?????? ????private?void?createFile()?throws?IOException{?? ????????try{?? ????????????File?tf?=?new?File(lockFileName);?? ????????????if(!?tf.exists()){?? ????????????????tf.createNewFile();?? ????????????}?? ????????????tf?=?null;?? ????????}catch(IOException?e){?? ????????????System.out.println(e+lockFileName);?? ????????????throw?e;?? ????????}?? ????}?? ?????? ????private?void?deleteFile(){?? ????????File?tf?=?new?File(lockFileName);?? ????????if(tf.exists()){?? ????????????tf.delete();?? ????????}?? ????????tf?=?null;?? ????}?? }??
?
工廠類:
?
Java代碼??
package?lock;?? ?? import?java.io.File;?? import?java.io.FileNotFoundException;?? import?java.io.IOException;?? ?? public?class?MakeLock?implements?Runnable{?? ????private?String?threadID?=?"";?? ????public?void?run()?{?? ????????try?{?? ????????????while(true)?{?? ????????????????test2(threadID);?? ????????????????Thread.sleep(200);?? ????????????}?? ????????}?catch?(IOException?e)?{?? ????????????System.out.println(e);?? ????????????e.printStackTrace();?? ????????}?catch?(InterruptedException?e)?{?? ????????????System.out.println(e);?? ????????}?? ????}?? ?????? ????public?void?test2(String?threadID)?throws?FileNotFoundException,?IOException,?InterruptedException{?? ????????Lock?lock?=?new?MakeLock(threadID).getLock("c:/001/lockfile001.lock",threadID);?? ????????????System.out.println(threadID+":obtain...");?? ????????????boolean?b?=?lock.obtain();?? ?? ?System.out.println(threadID+":obtained???"+b);?? ????????????if(b){?? ????????????????Thread.sleep(390);?? ????????????????for(int?i?=?0?;?i?<?Integer.MAX_VALUE?;?i?++){?? ????????????????????;?? ????????????????}?? ????????????????lock.unlock();?? ????????????}?? ????????lock?=?null;?? ?????????????? ????}?? ?????? ????public?MakeLock(String?threadID){?? ????????this.threadID?=?threadID;?? ????}?? ?????? ????public?Lock?getLock(String?name,String?threadID)?{?? ????????final?StringBuffer?buf?=?new?StringBuffer();?? ????????return?FileProgrameLock.get(name,threadID);?? ????}?? ?????? }??
?
?
?使用方法:
Java代碼??
public?void?test2(String?threadID)?throws?FileNotFoundException,?IOException,?InterruptedException{?? ????????Lock?lock?=?new?MakeLock(threadID).getLock("c:/001/lockfile001.lock",threadID);?? ????????if?(!lock.isLocked())?{?? ????????????System.out.println(threadID+":obtain...");?? ????????????boolean?b?=?lock.obtain();?? ????????????System.out.println(threadID+":obtained???"+b);?? ????????????if(b){?? ????????????????Thread.sleep(390);?? ????????????????for(int?i?=?0?;?i?<?Integer.MAX_VALUE?;?i?++){?? ????????????????????;?? ????????????????}?? ????????????????lock.unlock();?? ????????????}?? ????????}else{?? ????????????System.out.println(threadID+":can't?get?a?lock?:"+lock);?? ????????}?? ????????lock?=?null;?? ?????????????? ????}??
?
?
?
多線程調(diào)用測(cè)試:
?
Java代碼??
public?static?void?main(String[]?args)?{?? ?????????? ????????System.out.println("=========================================");?? ????????Thread?th1?=?new?Thread(new?MakeLock("====================?thread1?===================="));?? ????????Thread?th2?=?new?Thread(new?MakeLock("####################?thread2?####################"));?? ????????Thread?th3?=?new?Thread(new?MakeLock("@@@@@@@@@@@@@@@@@@@@?thread3?@@@@@@@@@@@@@@@@@@@@"));?? ????????Thread?th4?=?new?Thread(new?MakeLock("$$$$$$$$$$$$$$$$$$$$?thread4?$$$$$$$$$$$$$$$$$$$$"));?? ????????Thread?th5?=?new?Thread(new?MakeLock("&&&&&&&&&&&&&&&&&&&&?thread5?&&&&&&&&&&&&&&&&&&&&"));?? ????????th1.start();?? ????????th2.start();?? ????????th3.start();?? ????????th4.start();?? ????????th5.start();?? ????}??
?
?
=================
經(jīng)測(cè)試可以在共享文件系統(tǒng)下工作。
附件中AAA.java多線程測(cè)試代碼可以直接運(yùn)行。
總結(jié)
以上是生活随笔為你收集整理的JAVA文件锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。