目录
- 一、大部分人对Java并发仍停留在理论阶段
- 二、中间件系统的内核机制:双缓冲机制
- 三、百万并发的技术挑战
- 四、内存数据写入的锁机制以及串行化问题
- 五、片机制 + 分段加锁机制 六、缓冲区写满时的双缓冲交换
- 七、且慢!刷写磁盘不是会导致锁持有时间过长吗?
- 八、内存 + 磁盘并行写机制
- 九、为什么必须要用双缓冲机制?
- 十、总结
这篇文章,给大家聊聊一个百万级并发的中间件系统的内核代码里的锁性能优化。
很多同学都对Java并发编程很感兴趣,学习了很多相关的技术和知识。比如volatile、Atomic、synchronized底层、读写锁、AQS、并发包下的集合类、线程池,等等。
一、对Java并发仍停留在理论阶段
很多同学对Java并发编程的知识,可能看了很多的书,也通过不少视频课程进行了学习。
但是,大部分人可能还是停留在理论的底层,主要是了解理论,基本对并发相关的技术很少实践和使用,更很少做过复杂的中间件系统。
实际上,真正把这些技术落地到中间件系统开发中去实践的时候,是会遇到大量的问题,需要对并发相关技术的底层有深入的理解和掌握。
然后,结合自己实际的业务场景来进行对应的技术优化、机制优化,才能实现最好的效果。
因此,本文将从笔者曾经带过的一个高并发中间件项目的内核机制出发,来看看一个实际的场景中遇到的并发相关的问题。
同时,我们也将一步步通过对应的伪代码演进,来分析其背后涉及到的并发的性能优化思想和实践,最后来看看优化之后的效果。
二、中间件系统的内核机制:双缓冲机制
这个中间件项目整体就不做阐述了,因为涉及核心项目问题。我们仅仅拿其中涉及到的一个内核机制以及对应的场景来给大家做一下说明。
其实这个例子是大量的开源中间件系统、大数据系统中都有涉及到的一个场景,就是:核心数据写磁盘文件。
比如,大数据领域里的hadoop、hbase、elasitcsearch,Java中间件领域里的redis、mq,这些都会涉及到核心数据写磁盘文件的问题。
而很多大型互联网公司自研的中年间系统,同样也会有这个场景。只不过不同的中间件系统,他的作用和目标是不一样的,所以在核心数据写磁盘文件的机制设计上,是有一些区别的。
那么我们公司自研的中间件项目,简单来说,需要实现的一个效果是:开辟两块内存空间,也就是经典