2020-12-11:多個執行緒同時寫同一個日志檔案,為什么相互寫的內容不會被覆寫?#福大大架構師每日一題#
uj5u.com熱心網友回復:
這個問題問的好 回答uj5u.com熱心網友回復:
這個問題 問得好 ,你這個問題涉及到 系統底層 ,這就要看 操作 系統, 與 Windows 不同, Linux 允許一個檔案在寫入的時候被讀取(或者在被讀取的時候寫入)Linux 通過檔案描述符表維護了打開的檔案描述符資訊,而檔案描述符表中的每一項都指向一個內核維護的檔案表,檔案表指向打開的檔案的 vnode(Unix) 和 inode。同時,檔案表保存了行程對檔案讀寫的偏移量等資訊。
但是 那么我們要如何保證讀取與寫入的一致性呢? Linux 提供了 fcntl 系統呼叫,可以鎖定檔案。
檔案鎖是與行程相關的,一個行程中的多個執行緒/協程對同一個檔案進行的鎖操作會互相覆寫掉,從而無效。
fcntl 創建的鎖是建議性鎖,只有寫入的行程和讀取的行程都遵循建議才有效;對應的有強制性鎖,會在每次檔案操作時進行判斷,但性能較差,因此 Linux/Unix 系統默認采用的是建議性鎖。
uj5u.com熱心網友回復:
跟底層有關系
uj5u.com熱心網友回復:
因為作業系統內核已經幫你實作了讀寫操作的原子性保證(或鎖控制)uj5u.com熱心網友回復:
可以用foepn(FILE_NAME, "a")以append模式打開檔案,并且用setlinebuf()把檔案設定成行緩沖的。每次寫log的時候最后用\n結尾,保證不同行程的行不會重疊。uj5u.com熱心網友回復:
學到了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/233186.html
標籤:Java相關
上一篇:前端初學者求助
