Tom Xu

           

          線程和進程 對文件鎖的操作(RandomAccessFile MappedByteBuffer FileLock)

          1.文件鎖的分類
          文件鎖分為阻塞式文件鎖和非阻塞式的文件鎖,可以通過new FileChannel().tryLock /lock,后者是阻塞式,阻塞式意思是指當前進程沒有獲得文件鎖即刻等待直到有進程將對應文件的鎖釋放。

          2.文件鎖針對進程
          這里指進程的原因是因為對文件鎖而言一個線程同一時間段對同一個文件只能加上一把鎖,只有等待當前線程釋放掉后,才能繼續對文件加鎖,不然會報OverlappingFileLockException的錯誤,所以文件鎖是進程間的鎖。

          3.線程間預防重復加鎖,減少讀寫文件等待時間
          //給該文件加鎖  
                      RandomAccessFile fis = new RandomAccessFile(file, "rws"); //單一線程的讀寫同步
                      FileChannel fcin=fis.getChannel(); // 獲得文件通道
                      FileLock flin=null; //聲明文件鎖對象
                      int operateNum=10; //若文件鎖一直別占用,設置最大讀取次數為10次,超出次數表示文 //件不可讀,
                      For(int i=0;i<operateNum,i++){ 
                          try {
                                  flin = fcin.tryLock(); // 獲取文件非阻塞鎖,如果不能獲取,繼續等待0.5s.
                                  break;
                              } catch (Exception e) {
                           System.out.println("有其他線程正在操作該文件,當前線程休眠500毫秒"); 
                           sleep(500);   
                           If((i+1)>=operateNum){
                                 Throw e //文件被強制占用 ,處于不可讀的狀態    
                               }    
                          }
                      }  
                       //獲取成功
                      //進行文件的讀或寫的操作
                      RandomAccessFile 流中讀出文件的數據;           
                      RandomAccessFile 流向該文件寫入新數據;
                      //該文件的操作完畢,釋放該文件鎖和相關資源
                      flin.release();
                      fcout.close();
                      out.close();
          4.線程寫文件加鎖后,讀文件線程不需加鎖的方法(保證讀寫同步)
                  寫線程:
                      RandomAccessFile fos=new RandomAccessFile(file,"rws");
                      FileChannel fileC=fos.getChannel();
                      FileLock fileL=null;
                      while(true){
                          try{
                              fileL=fileC.lock();
                              break;
                          }catch(Exception e){
                              try {
                                  System.out.println("**********************************文件被操作,寫文件線程休眠0.2m");
                                  Thread.sleep(200);
                              } catch (InterruptedException e1) {
                                  e1.printStackTrace();
                              }
                          }
                      }
                   /*注意此種方法寫線程必須使用RandomAccessFile,FileOutputStream 會報錯,可能是讀文件時使用文件映射,為保證讀寫*/
                   讀線程:
                     RandomAccessFile fis=new RandomAccessFile(file,"rws");
                     MappedByteBuffer mbb=fis.getChannel().map(FileChannel.MapMode.READ_WRITE, 0, (int)fis.length());
                     byte[] buf = new byte[(int) fis.length()];
                     for(int i=0;i<fis.length();i++){
                          buf[i]= mbb.get(i);
                     }
                 /*注意此方法讀線程使用FileInputStream 好像有文件不能同步的問題*/
                   

          posted on 2012-10-26 18:34 Tom Xu 閱讀(4204) 評論(1)  編輯  收藏

          評論

          # re: 線程和進程 對文件鎖的操作(RandomAccessFile MappedByteBuffer FileLock) 2012-10-27 19:31 @IT蟲@

          能不能在詳細點啊  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鹤峰县| 汨罗市| 广灵县| 泾源县| 西吉县| 沂南县| 三原县| 峨山| 宁海县| 青海省| 吉林省| 清涧县| 黄骅市| 兰西县| 龙海市| 大余县| 永泰县| 滕州市| 虎林市| 外汇| 湟中县| 衡阳县| 台州市| 大庆市| 略阳县| 扬州市| 黔西县| 莒南县| 会宁县| 长泰县| 鄯善县| 金华市| 蕉岭县| 滦平县| 井冈山市| 大英县| 新疆| 福清市| 筠连县| 富源县| 天水市|