Java:缓冲行(cache line)的一些问题
对缓冲行我还有些地方不太理解,
1 缓存一致性下缓冲行失效是不是仅针对volatile,如果不是volatile变量应该不会有这种问题吧?
2 具体实践的时候,什么情况下才进行缓冲行填充?所有高并发情况下成员volatile变量频繁写的类都要进行缓冲行填充吗?都要使用disruptor框架?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
准确来说确实不是针对volatile,而是解决了volatile内存可见性带来的false sharing问题的。如果不是volatile这种问题应该不会存在。
具体实践中,也是一般针对基本数据类型的volatile比较合适,因为行缓冲中的cache line的大小一般也就只有64字节而已。
除了disruptor框架,你可以查看hystrix和java8中的Long adder
前几天刚看了几篇相关文章,说一下我的理解吧,权作交流,有不对的地方还请指正。
首先说说我对题目中的几个相关重要概念的理解:
然后,针对题主的问题,说说我的看法:
最后总结一下题主两个问题的答案:
缓存一致性
是一个需要解决的问题,volatile
和缓存行填充
是解决两个不同但有一定关联关系的问题的方式,如果没有并发写,也就没有缓存一致性问题,也就不需要volatile和缓存行填充了缓存行填充
是为了解决伪共享
问题,理论上来说,所有并发写入同一缓存行的不同变量的操作都会产生伪共享问题,高并发下volatile变量频繁写肯定需要进行缓存行填充
。至于disruptor框架,不巧我还不是很了解,但如果你能手动进行缓存行填充的话,也不是必须要用吧?