2020-12-11:多个线程同时写同一个日志文件,为...

createh53个月前 (02-01)技术教程34

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

福哥答案2020-12-11:

[答案来自此链接:](https://bbs.csdn.net/topics/398512874)

这是道面试题,可惜我没什么思路,网上找了些答案。如果有更好的答案,请直接评论。

1.没看代码前,以为会用到缓存队列+组提交。

2.golang的日志源码位于log/log.go中的Output方法。加锁了。

3.系统级别。当打开文件并设置了O_APPEND标识,内核会共享文件写入游标,保证内容不会被覆盖。

这个问题涉及到 系统底层 ,这就要看 操作 系统, 与 Windows 不同, Linux 允许一个文件在写入的时候被读取(或者在被读取的时候写入)。

Linux 通过文件描述符表维护了打开的文件描述符信息,而文件描述符表中的每一项都指向一个内核维护的文件表,文件表指向打开的文件的 vnode(Unix) 和 inode。同时,文件表保存了进程对文件读写的偏移量等信息。

但是 那么我们要如何保证读取与写入的一致性呢? Linux 提供了 fcntl 系统调用,可以锁定文件。

文件锁是与进程相关的,一个进程中的多个线程/协程对同一个文件进行的锁操作会互相覆盖掉,从而无效。

fcntl 创建的锁是建议性锁,只有写入的进程和读取的进程都遵循建议才有效;对应的有强制性锁,会在每次文件操作时进行判断,但性能较差,因此 Linux/Unix 系统默认采用的是建议性锁。

***

[评论](https://user.qzone.qq.com/3182319461/blog/1607641238)

相关文章

java进行后台数据写入word模板再进行压缩包下载

经常会遇到这样需求,写一个导出功能,进行word模板格式进行导出,数据库相应数据回填到word模板中,再对这个模板进行导出功能。如果一次性需要导出多个模板情况下,就要对多个进行压缩成一个压缩包再一次性...

java实现文件上传到服务器(java实现文件上传的三种方式)

java实现文件上传到服务器,java实现大文件上传,java实现大文件分块上传,java实现大文件分片上传,java实现大文件切片上传,java实现大文件批量上传,java实现大文件加密上传,jav...

Java高级特性——注解:注解实现Excel导出功能

注解是 Java 的一个高级特性,Spring 更是以注解为基础,发展出一套“注解驱动编程”。这听起来高大上,但毕竟是框架的事,我们也能用好注解吗?的确,我们很少有机会自己写注解,导致我们搞不清楚注解...

Android 读写文件(安卓开发读写文件)

Android使用一个非常类似与其他平台上的基于磁盘的文件系统. 这节课讲述如何利用File APIs在Android文件系统中读写文件.File 对象非常适合于流式顺序数据的读写. 如图片文件或是网...

「Java进阶」I/O操作必备知识点:字节流读写实例讲解

序欢迎来到全网最完整的Java进阶知识系列教程!!!每天定时更新!!!本期的课程,我们继续分享I/O文件读写。IO文件读写,根据数据格式不同,分为字节流读写和字符流读写,我们今天先讲字节流读写。如果你...

生成javadoc(生成javacore的命令)

Java Tar生成是一种常用的文件打包和压缩技术,通过将多个文件或目录打包成一个.tar文件,实现了文件的整合和压缩。本文将详细介绍Java Tar生成的原理和使用方法,帮助读者快速掌握这一技术。1...