今儿新学会一个写日志技能:双缓冲机制
2023-02-18 15:36:55 时间
摘要:通过交换指针的方式实现两个缓冲区的功能互换,十分巧妙,令人称赞。
本文分享自华为云社区《奇妙的双缓冲机制写日志(Java实现)》,作者: 洛叶飘 。
写日志面临的问题
写日志在Web程序中是一个十分基础与常见的需求,其对性能的要求很高。主要需要处理以下问题:
- 多线程并发,需要保证顺序性。
- 高配IO操作,但IO操作相比其他指令耗时长,性能低。
即一方面需要面对程序端高配的日志写请求,一方面需要受限于系统磁盘相对缓慢写入文件,应该如何处理呢。
双缓冲区
因此,引入双缓冲区机制,一个缓冲区存储应用程序端发送的日志,按照时间顺序依次存储;另一个缓冲区负责向低层磁盘发送写文件请求。
写文件请求执行相对较慢,因此当写文件执行完毕后,通知管理程序,此时可以将另一个缓冲区内容写入磁盘了。
双缓冲区的奇妙之处就在于,两个缓冲区的交换,是通过交换指针来实现的,非常的高效。
部分实现代码如下(其他部分逻辑代码已省略)。
双缓冲区代码,不使用Java现有的线程安全类,后续通过加锁保证数据安全。
// 负责接收应用程序发来的日志 LinkedList<String> currentBuffer = new LinkedList<>(); // 负责将数据同步到磁盘 LinkedList<String> syncBuffer = new LinkedList<>();
第一个缓冲区,接收应用程序高速写日志请求
public void log(String content) { // 加锁保证第一个缓冲区 synchronized(this) { // 将log写入内存缓冲中,这里不会直接刷入磁盘文件 currentBuffer.add(content); } // 将缓冲区中的内容刷到磁盘 logSync(); }
第二缓冲区,向磁盘写日志,并在写入后交换缓冲区指针
private void logSync() { synchronized(this) { // 当前在刷内存缓冲到磁盘中去 if (isSyncRunning) { // 判断是否第二个缓冲区还在刷 while (isSyncRunning) { try { // 释放锁,即允许第一个缓冲区继续接收日志缓存, 然后等待被唤醒 wait(2000); } catch (Exception e) { e.printStackTrace(); } } // 此时没有人在写磁盘 } // 交换缓冲区指针 setReadyToSync(); // 设置当前正在同步到磁盘的标志位 isSyncRunning = true; } // 刷磁盘,性能最低,不能加锁 logBuffer.flush(); synchronized(this) { // 同步完磁盘之后,将标志位复位 isSyncRunning = false; // 唤醒其他等待刷磁盘的线程 notifyAll(); } }
交换缓冲区指针,功能变更
public void setReadyToSync() { LinkedList<String> tmp = currentBuffer; currentBuffer = syncBuffer; syncBuffer = tmp; }
奇妙之处
两个缓冲区各自处理,互不干扰
两个缓冲区很好的解决了应用程序的“快速、多线程”与IO操作的“缓慢,单线程”的矛盾。应该说,引入双缓冲区是一个显而易见的方式。
缓冲区交换
通过交换指针的方式实现两个缓冲区的功能互换,十分巧妙,令人称赞。
总结
你知道吗?电视机里也在用着双缓冲机制
相关文章
- Vue DevUI v1.4 版本发布:从体验、效率、质量三个方面做了全方位的优化🎉
- 使用Angular构建单页面应用(SPA)
- 如何在 pyqt 中实现桌面歌词
- 对 python 中 @property 和计算属性的一些思考
- 如何使用 numpy 和 pytorch 快速计算 IOU
- 实践案例丨基于ModelArts AI市场算法MobileNet_v2实现花卉分类
- 美女面试官问我Python如何优雅的创建临时文件,我的回答....
- 绝了,华为云服务器“The 3”出道,每款都很能打
- Volcano火山:容器与批量计算的碰撞
- 【华为云技术分享】LiteOS无法直接烧录或者烧录失败解决方法--ST-Link
- 快速了解云原生中的微服务应用(内含福利)
- 从软件开发到 AI 领域工程师:模型训练篇
- 【福利活动】华为云“上云之路”征文大赛开启,FreeBuds3无线耳机等重磅好礼送不停
- 【儿童节特辑】风格迁移——让你的照片秒变手绘日漫风
- 【极客思考】计算机网络:Wireshark抓包分析TCP中的三次握手与四次挥手
- 低代码开发平台发展趋势:低代码——炒作还是趋势?
- 我们谈自动驾驶网络到底在谈什么?
- 【昇腾】ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(完整版)
- 疫情数据背后,聊聊数据分析平台变迁史
- 华为五大专家亲述:如何转型搞 AI?