java控制多線程同時寫一個文件


一、緣起

最近出現一個需求,大體要做的就是控制多線程同時操作一個文件。當時第一個反應是不要用synchronized,太low了,然后我就使用了讀寫鎖ReentrantReadWriteLock,然后寫完靜下來和業務結合在一起分析一下,結果尷尬了。因為文件名可能是別的線程剛剛生成的帶上了時間戳,線程A寫orders_201904171130.xls文件,線程B寫orders_201904171131.xls文件,這個時候實際上時不能阻塞的。Lock沒辦法像synchronized關鍵字一樣,給定一把鎖,鎖住特定的對象。鎖對象不同,則不阻塞

然后試着使用synchronized代碼塊,使用filename作為鎖對象,初一看好像可以,但是經不住測試哇,測試的時候即使同一個文件名,還是不能阻塞,因為filename是屬於拼接起來的,且還是局部變量,所以這個filename的string雖然在常量池中值是一樣的,但是在堆里的對象地址是不一樣的,所以synchronized肯定認為不是同一個對象鎖,所以同一個文件名並沒有阻塞

然后想起來使用RandomAccessFile和FileLock實現,但是我這種情況下是往遠程服務器共享目錄讀寫,File類是用不了的。所以他也用不了。

二、使用synchronized實現

如上述所說,文件名屬於拼接的,雖然是指向同一個常量,但是String的堆地址變化了,所以采用intern()方法可以做到。api表示:一個與該字符串具有相同內容的字符串,但保證來自一個唯一字符串池。。它的返回值:一個字符串,內容與此字符串相同,但一定取自具有唯一字符串的池。

 

至於寫文件的代碼就不貼了,大致就是在寫的部分使用synchronized代碼塊,對象鎖直接使用intern()方法返回的filename

 

三、使用RandomAccessFile和FileLock相結合

附上RandomAccessFile和FileLock實現處理多人同時讀寫文件的參考連接:

https://blog.csdn.net/gxy3509394/article/details/7435993

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM