一个比较经典的开源项目是muduo网络库:GitHub - chenshuo/muduo: Event-driven network library for multi-threaded Linux server in C++11

其中网络日志的部分就很好地使用了双缓冲技术。

https://github.com/chenshuo/muduo/blob/master/muduo/base/AsyncLogging.cc

muduo日志库是用双缓冲技术。基本思路是准备两块buffer:A和B, 前端负责往buffer A填数据(日志消息), 后端负责将buffer B的数据写入文件;当buffer A写满之后, 交换A和B, 让后端将buffer A的数据写入文件, 而前端则往buffer B填入新的日志消息, 如此往复。

Java 双缓冲区的基本原理 什么是双缓冲机制_开发语言

  使用两个buffer的好处是在新建日志消息的时候不必等待磁盘文件操作,也避免每条新日志消息都触发后端日志线程。换句话说,前端不是将一条条日志消息分别送给后端,而是将多条日志消息拼接成一个大的buffer传送给后端,相当于批处理,减少了线程唤醒的开销。
 

实际上实现如下:
 

Java 双缓冲区的基本原理 什么是双缓冲机制_双缓冲_02

在后端设置一个已满缓冲队列(Buffer1~n,2<=n<=16),用于缓存一个周期内临时要写的日志消息。

这样做到好处在于:
1)线程安全;2)非阻塞。

这样,2个buffer在前端写日志时,不必等待磁盘文件操作,也避免每写一条日志消息都触发后端线程。

异常处理:
当一个周期内,产生过多Buffer入队列,当超过队列元素上限数量值25时,直接丢弃多余部分,并记录。