2020-12-11:多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?

福大大架构师每日一题 2020-12-11 07:04:15
2020-12-11:多个线程同时写同一个日志文件,为什么相互写的内容不会被覆盖?#福大大架构师每日一题#
...全文
3531 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2020-12-11
  • 打赏
  • 举报
回复
因为操作系统内核已经帮你实现了读写操作的原子性保证(或锁控制)
赵博林 2020-12-11
  • 打赏
  • 举报
回复
跟底层有关系
aaaak_ 2020-12-11
  • 打赏
  • 举报
回复
这个问题 问得好 ,你这个问题涉及到 系统底层 ,这就要看 操作 系统, 与 Windows 不同, Linux 允许一个文件在写入的时候被读取(或者在被读取的时候写入) Linux 通过文件描述符表维护了打开的文件描述符信息,而文件描述符表中的每一项都指向一个内核维护的文件表,文件表指向打开的文件的 vnode(Unix) 和 inode。同时,文件表保存了进程对文件读写的偏移量等信息。 但是 那么我们要如何保证读取与写入的一致性呢? Linux 提供了 fcntl 系统调用,可以锁定文件。 文件锁是与进程相关的,一个进程中的多个线程/协程对同一个文件进行的锁操作会互相覆盖掉,从而无效。 fcntl 创建的锁是建议性锁,只有写入的进程和读取的进程都遵循建议才有效;对应的有强制性锁,会在每次文件操作时进行判断,但性能较差,因此 Linux/Unix 系统默认采用的是建议性锁。
  • 打赏
  • 举报
回复
这个问题问的好 回答
  • 打赏
  • 举报
回复
学到了
jvliao 2020-12-11
  • 打赏
  • 举报
回复
可以用foepn(FILE_NAME, "a")以append模式打开文件,并且用setlinebuf()把文件设置成行缓冲的。每次写log的时候最后用\n结尾,保证不同进程的行不会重叠。

51,397

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧