对缓冲行我还有些地方不太理解,
1 缓存一致性下缓冲行失效是不是仅针对volatile,如果不是volatile变量应该不会有这种问题吧?
2 具体实践的时候,什么情况下才进行缓冲行填充?所有高并发情况下成员volatile变量频繁写的类都要进行缓冲行填充吗?都要使用disruptor框架?
对缓冲行我还有些地方不太理解,
1 缓存一致性下缓冲行失效是不是仅针对volatile,如果不是volatile变量应该不会有这种问题吧?
2 具体实践的时候,什么情况下才进行缓冲行填充?所有高并发情况下成员volatile变量频繁写的类都要进行缓冲行填充吗?都要使用disruptor框架?
前几天刚看了几篇相关文章,说一下我的理解吧,权作交流,有不对的地方还请指正。
首先说说我对题目中的几个相关重要概念的理解:
然后,针对题主的问题,说说我的看法:
最后总结一下题主两个问题的答案:
缓存一致性
是一个需要解决的问题,volatile
和缓存行填充
是解决两个不同但有一定关联关系的问题的方式,如果没有并发写,也就没有缓存一致性问题,也就不需要volatile和缓存行填充了缓存行填充
是为了解决伪共享
问题,理论上来说,所有并发写入同一缓存行的不同变量的操作都会产生伪共享问题,高并发下volatile变量频繁写肯定需要进行缓存行填充
。至于disruptor框架,不巧我还不是很了解,但如果你能手动进行缓存行填充的话,也不是必须要用吧?3 回答2.8k 阅读✓ 已解决
3 回答4.3k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
8 回答3.9k 阅读
3 回答2.6k 阅读✓ 已解决
4 回答2.1k 阅读
3 回答1.6k 阅读✓ 已解决
准确来说确实不是针对volatile,而是解决了volatile内存可见性带来的false sharing问题的。如果不是volatile这种问题应该不会存在。
具体实践中,也是一般针对基本数据类型的volatile比较合适,因为行缓冲中的cache line的大小一般也就只有64字节而已。
除了disruptor框架,你可以查看hystrix和java8中的Long adder