java多執行緒讀寫檔案之檔案鎖

2021-06-22 04:21:52 字數 1459 閱讀 7333

檔案修改始終是一件很麻煩也很出錯的行為。多執行緒讀寫檔案更是會加大檔案內容混亂的機率,這時,一定要保證在某乙個時刻,只有乙個執行緒在對檔案進行讀寫操作。那麼其他訪問檔案的執行緒該怎麼辦呢?就像去atm取錢一樣,當atm正在被使用時,那麼其他想要使用atm的人只能等待知道atm能使用。

讀寫檔案也一樣,當乙個執行緒獲得檔案時,給予這個執行緒檔案鎖。只有擁有檔案鎖的執行緒才能操作檔案,其他執行緒就需要一直等待,直到獲得檔案鎖。

下面的**實現了如下的功能:

讀取檔案內容;

對內容進行修改;

將修改後的內容寫入檔案;

替換掉原有的內容。

需要注意的地方有:

檔案鎖定;

替換檔案內容時檔案指標的位置;

新內容寫入檔案時,會覆蓋掉原有的內容。注意是覆蓋。過新的內容比原有內容少,那麼只會覆蓋掉新內容長度的字元。例如原有內容是:ab,新寫入的內容是:1,些動作完成只夠,檔案的內容是:1b。因此這裡要注意選擇。

private void addconfig(string configstr) catch (exception e) 

}string content = readconfig(write, configstr);

write.seek(0);//替換原有檔案內容

write.write(content.getbytes());

lock.release();

channel.close();

write.close();

} catch (ioexception e)

}

**中的

readconfig(randomaccessfile write , string configstr)
方法會讀取檔案內容,並將字串configstr插入其中。其實現如下:

private string readconfig(randomaccessfile reader, string configstr) 

}} else

return sb.tostring();

} catch (ioexception e)

}

因為讀寫都是用的同乙個randomaccessfile,所以當讀取動作執行完成之後,此時的檔案指標已經在檔案內容末尾了。要替換掉原有的內容就需要將指標移到檔案首部。需要

write.seek(0);
這個方法來實現。此時寫入的內容就會覆蓋掉原來檔案中的內容。

不足:在獲取檔案鎖的地方:

while(true) catch (exception e) 

}

不論怎麼看都覺得有點彆扭,你是否有好的解決方案呢?

多執行緒學習之七讀寫鎖

read write lock pattern 讀寫 一 read write lock pattern的參與者 讀寫鎖 資料 共享資源 讀執行緒 寫執行緒 二read write lock pattern模式什麼時候使用 為了多線執行緒環境下保護資料安全,我們必須避免的衝突 乙個執行緒讀取,另乙個...

多執行緒學習 讀寫鎖

讀寫鎖 reentrantreadwritelock 具有互斥排他效果,即同一時間只有乙個執行緒在執行鎖後面的任務,這種效率比較搞。讀鎖也稱為共享鎖,寫鎖也稱為排他鎖。多個讀鎖之間不互斥,讀鎖與寫鎖互斥,寫鎖與寫鎖互斥。在沒有執行緒thread進行寫入操作時,進行讀取操作的多個執行緒都可以獲取讀鎖,...

多執行緒之讀寫鎖

之前沒真正使用讀寫鎖,看到別人對讀寫鎖的解釋總感覺一頭霧水。今天親自敲 實驗之後,才明了,原來如此。網上沒有一篇文章是能描述出自己理解的樣子,所以將自己的思路記下來。先提出疑問,邊自答邊找思路,有了思路,再回頭去執行一下 就清晰明了了。如果你急著想要一句話概括讀寫鎖,那我會告訴你 讀鎖是加在讀方法裡...