日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

JAVA文件锁

發布時間:2025/4/14 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JAVA文件锁 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

項目使用到集群環境,流程發送時如果確保一個流程不會被兩個流程同時調用?

有一種辦法是用文件鎖的方式來實現。

代碼如下:

鎖接口:

Java代碼??
  • package?lock;??
  • ??
  • import?java.io.FileNotFoundException;??
  • import?java.io.IOException;??
  • ??
  • public?interface?Lock?{??
  • ??
  • ????/**?
  • ?????*?檢測是否被鎖定?
  • ?????*?@return?true被鎖定?,false空閑?
  • ?????*?*/??
  • ????public?abstract?boolean?isLocked()?throws?FileNotFoundException;??
  • ??
  • ????/**?
  • ?????*?獲取鎖資源?
  • ?????*?@return?true成功鎖定目標資源?,false鎖定操作失敗?
  • ?????*?*/??
  • ????public?abstract?boolean?obtain()?throws?IOException;??
  • ??
  • ????/**?
  • ?????*?釋放鎖?
  • ?????*?*/??
  • ????public?abstract?void?unlock();??
  • ??
  • }??
  • ?

    ?

    文件鎖的實現:

    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;??
  • ????}??
  • ??????
  • ????/**?
  • ?????*?檢測是否被鎖定-不建議使用?
  • ?????*?@return?true被鎖定?,false空閑?
  • ?????*?@deprecated??
  • ?????*?*/??
  • ????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();??
  • ????????????}??
  • ??????????????
  • ????????}??
  • ????}??
  • ??
  • ????/**?
  • ?????*?獲取鎖資源?
  • ?????*?@return?true成功鎖定目標資源?,false鎖定操作失敗?
  • ?????*?*/??
  • ????public?boolean?obtain()?throws?IOException?{??
  • ????????File?tf?=?new?File(lockFileName);??
  • ????????createFile();??
  • ????????channel?=?new?RandomAccessFile(tf,?"rw").getChannel();??
  • ????????try?{??
  • //??????????System.out.println("get?lock?000?>>>>>>>>>>>>>>>");??
  • ????????????lock?=?channel.lock();??
  • //??????????System.out.println("get?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();??
  • //當有重疊時會發生等待,所以外側先執行isLocked()判斷??
  • ?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;??
  • ??????????????
  • ????}??
  • ?

    ?

    ?

    多線程調用測試:

    ?

    Java代碼??
  • public?static?void?main(String[]?args)?{??
  • ????????//new?AAA().test();??
  • ????????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();??
  • ????}??
  • ?

    ?

    =================

    經測試可以在共享文件系統下工作。

    附件中AAA.java多線程測試代碼可以直接運行。

    總結

    以上是生活随笔為你收集整理的JAVA文件锁的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。