今儿新学会一个写日志技能:双缓冲机制
摘要:通过交换指针的方式实现两个缓冲区的功能互换,十分巧妙,令人称赞。
本文分享自华为云社区《奇妙的双缓冲机制写日志(Java实现)》,作者: 洛叶飘 。
写日志面临的问题
写日志在 Web 程序中是一个十分基础与常见的需求,其对性能的要求很高。主要需要处理以下问题:
1. 多线程并发,需要保证顺序性。
2. 高配 IO 操作,但 IO 操作相比其他指令耗时长,性能低。
即一方面需要面对程序端高配的日志写请求,一方面需要受限于系统磁盘相对缓慢写入文件,应该如何处理呢。
双缓冲区
因此,引入双缓冲区机制,一个缓冲区存储应用程序端发送的日志,按照时间顺序依次存储;另一个缓冲区负责向低层磁盘发送写文件请求。
写文件请求执行相对较慢,因此当写文件执行完毕后,通知管理程序,此时可以将另一个缓冲区内容写入磁盘了。
双缓冲区的奇妙之处就在于,两个缓冲区的交换,是通过交换指针来实现的,非常的高效。
部分实现代码如下(其他部分逻辑代码已省略)。
双缓冲区代码,不使用 Java 现有的线程安全类,后续通过加锁保证数据安全。
第一个缓冲区,接收应用程序高速写日志请求
第二缓冲区,向磁盘写日志,并在写入后交换缓冲区指针
交换缓冲区指针,功能变更
奇妙之处
两个缓冲区各自处理,互不干扰
两个缓冲区很好的解决了应用程序的“快速、多线程”与 IO 操作的“缓慢,单线程”的矛盾。应该说,引入双缓冲区是一个显而易见的方式。
缓冲区交换
通过交换指针的方式实现两个缓冲区的功能互换,十分巧妙,令人称赞。
总结
你知道吗?电视机里也在用着双缓冲机制
版权声明: 本文为 InfoQ 作者【华为云开发者社区】的原创文章。
原文链接:【http://xie.infoq.cn/article/093fc91dbbfce75010146a9dc】。文章转载请联系作者。
评论