<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Tom Xu

     

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

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

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

    3.線程間預(yù)防重復(fù)加鎖,減少讀寫文件等待時間
    //給該文件加鎖  
                RandomAccessFile fis = new RandomAccessFile(file, "rws"); //單一線程的讀寫同步
                FileChannel fcin=fis.getChannel(); // 獲得文件通道
                FileLock flin=null; //聲明文件鎖對象
                int operateNum=10; //若文件鎖一直別占用,設(shè)置最大讀取次數(shù)為10次,超出次數(shù)表示文 //件不可讀,
                For(int i=0;i<operateNum,i++){ 
                    try {
                            flin = fcin.tryLock(); // 獲取文件非阻塞鎖,如果不能獲取,繼續(xù)等待0.5s.
                            break;
                        } catch (Exception e) {
                     System.out.println("有其他線程正在操作該文件,當前線程休眠500毫秒"); 
                     sleep(500);   
                     If((i+1)>=operateNum){
                           Throw e //文件被強制占用 ,處于不可讀的狀態(tài)    
                         }    
                    }
                }  
                 //獲取成功
                //進行文件的讀或?qū)懙牟僮?br />            RandomAccessFile 流中讀出文件的數(shù)據(jù);           
                RandomAccessFile 流向該文件寫入新數(shù)據(jù);
                //該文件的操作完畢,釋放該文件鎖和相關(guān)資源
                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,F(xiàn)ileOutputStream 會報錯,可能是讀文件時使用文件映射,為保證讀寫*/
             讀線程:
               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 閱讀(4199) 評論(1)  編輯  收藏

    評論

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

    能不能在詳細點啊  回復(fù)  更多評論   


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


    網(wǎng)站導(dǎo)航:
     

    導(dǎo)航

    統(tǒng)計

    常用鏈接

    留言簿

    隨筆分類

    隨筆檔案

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 麻豆视频免费播放| 特级精品毛片免费观看| 嫩草视频在线免费观看| 亚洲国产精品综合福利专区| 日韩精品久久久久久免费| 亚洲免费在线视频| 亚洲电影在线免费观看| 国产成人亚洲精品| 无码国产精品一区二区免费I6| 亚洲视频免费在线看| 亚洲第一成年免费网站| 亚洲综合欧美色五月俺也去| 精品少妇人妻AV免费久久洗澡| 日韩欧美亚洲中文乱码| 亚洲精品久久久www| 毛片免费在线观看| 亚洲一区在线视频| 青青青国产免费一夜七次郎| 无码色偷偷亚洲国内自拍| 亚洲一本大道无码av天堂| 三年片在线观看免费西瓜视频| 亚洲视频免费播放| 国产成人免费全部网站| 亚洲精品视频免费| 亚洲人成网站影音先锋播放| 成人免费午夜在线观看| 无遮挡免费一区二区三区 | 久久综合给合久久国产免费| 亚洲youjizz| 亚洲第一福利网站在线观看| 人人玩人人添人人澡免费| avtt天堂网手机版亚洲| 亚洲国产综合精品中文字幕| 国产成人精品无码免费看| 亚洲国产区男人本色在线观看| 午夜亚洲av永久无码精品| 久久久久免费看成人影片| 亚洲国产成人久久精品大牛影视| 亚洲精品无码国产| 成人五级毛片免费播放| 免费日本一区二区|