96SEO 2026-02-19 16:44 7
可以保证多个生产者同时访问队列是线程安全的#xff0c;而且同一时刻只允许一个消费者从队列中读取数据。

可以保证多个生产者同时访问队列是线程安全的而且同一时刻只允许一个消费者从队列中读取数据。
MpscArrayQueue、MpscUnboundedArrayQueue、MpscChunkedArrayQueue
MpscArrayQueue回过头再学习其他类型的队列会事半功倍。
AbstractCollection、AbstractQueueMpscArrayQueue
的类。
我们可以发现一个很有意思的规律每个有包含属性的类后面都会被
ConcurrentCircularArrayQueueL0Pad
MpmcArrayQueueProducerIndexField
MpscArrayQueueProducerLimitField
MpscArrayQueueConsumerIndexField
类型的变量其命名没有什么特殊的含义只是起到填充的作用。
如果你也读过
什么是伪共享呢我们有必要补充这方面的基础知识。
在计算机组成中CPU
L3最后还没命中的话只能从内存中查找读取完成后再将数据逐级放入缓存中。
此外多线程之间共享一份数据的时候需要其中一个线程将数据写回主存其他线程访问主存数据。
伪共享问题是如何发生的呢它又会造成什么影响呢我们使用下面这幅图进行讲解。
被越多的线程修改那么造成的写竞争就会越激烈数据会频繁写入内存导致性能浪费。
原来一个缓存行被多个线程修改,是因为一个缓存行存储了多个数据,每个数据可能由不同的线程修改。
所以我们可以让一个缓存行只存储一个数据。
这样可以降低多个线程同时访问一个数据的概率。
都采取了空间换时间的策略让不同线程共享的对象加载到不同的缓存行即可。
下面我们通过一个简单的例子进行说明。
伪共享问题一般是非常隐蔽的在实际开发的过程中并不是项目中所有地方都需要花费大量的精力去优化伪共享问题。
CPU
的填充本身也是比较珍贵的我们应该把精力聚焦在一些高性能的数据结构设计上把资源用在刀刃上使系统性能收益最大化。
使用缓存行的对齐能够提高效率也就是让数据位于同一缓存行会浪费内存(会定义很多变量)但是能提升效率。
sun.misc.Contended。
加上这个注解的类会自动补齐缓存行需要注意的是此注解默认是无效的需要在
2.将程序和数据从内存加载到缓存中(目前三级缓存数据加载顺序:L3-L2-L1)
现在的CPU基本都是多核CPU服务器更是提供了多CPU的支持而每个核心也都有自己独立的缓存当多个核心同时操作多个线程对同一个数据进行更新时如果核心2在核心1还未将更新的数据刷回内存之前读取了数据并进行操作就会造成程序的执行结果造成随机性的影响这对于我们来说是无法容忍的。
而总线加锁是对整个内存进行加锁在一个核心对一个数据进行修改的过程中。
其他的核心也无法修改内存中的其他数据这样对导致CPU处理性能严重下降。
它只会对单个缓存行(缓存行是缓存中数据存储的基本单元)的数据进行加锁不会影响到内存中其他数据的读写。
缓存一致性协议有MSIMESIMOSISynapseFirefly及DragonProtocol等等接下来我们主要介绍MESI协议。
MESI分别代表缓存行数据所处的四种状态通过对这四种状态的切换来达到对缓存数据进行管理的目的。
------------------------------------
------------------------------------------------------------------
该缓存行有效数据被修改了和内存中的数据不一致数据只存在于本缓存行中
缓存行必须时刻监听所有试图读该缓存行相对应的内存的操作其他缓存须在本缓存行写回内存并将状态置为E之后才能操作该缓存行对应的内存数据
缓存行必须监听其他缓存读主内存中该缓存行相对应的内存的操作一旦有这种操作该缓存行需要变成S状态
缓存行必须监听其他缓存是该缓存行无效或者独享该缓存行的请求并将该缓存行置为I状态
1.MESI协议只对汇编指令中执行加锁操作的变量有效表现到java中为使用voliate关键字定义变量或使用加锁操作。
volatile是Java这种高级语言中的一个关键字要实现这个volatile的功能需要借助MESI
CPU有缓存一致性协议MESI这不错。
但MESI并非是无条件生效的
https://www.zhihu.com/question/296949412
2.对于汇编指令中执行加锁操作的变量MESI协议在以下两种情况中也会失效
二、该变量超过一个缓存行的大小缓存一致性协议是针对单个缓存行进行加锁此时缓存一致性协议无法再对该变量进行加锁只能改用总线加锁的方式。
MESI工作原理(此处统一默认CPU为单核CPU在多核CPU内部执行过程和下面流程一致)
1、CPU1从内存中将变量a加载到缓存中并将变量a的状态改为E(独享)并通过总线嗅探机制对内存中变量a的操作进行嗅探
2、此时CPU2读取变量a总线嗅探机制会将CPU1中的变量a的状态置为S(共享)并将变量a加载到CPU2的缓存中状态为S
3、CPU1对变量a进行修改操作此时CPU1中的变量a会被置为M(修改)状态而CPU2中的变量a会被通知改为I(无效)状态此时CPU2中的变量a做的任何修改都不会被写回内存中(高并发情况下可能出现两个CPU同时修改变量a并同时向总线发出将各自的缓存行更改为M状态的情况此时总线会采用相应的裁决机制进行裁决将其中一个置为M状态另一个置为I状态且I状态的缓存行修改无效)
4、CPU1将修改后的数据写回内存并将变量a置为E(独占)状态
5、此时CPU2通过总线嗅探机制得知变量a已被修改会重新去内存中加载变量a同时CPU1和CPU2中的变量a都改为S状态
在上述过程第3步中CPU2的变量a被置为I(无效)状态后只是保证变量a的修改不会被写回内存但CPU2有可能会在CPU1将变量a置为E(独占)状态之前重新读取内存中的变量a这个取决于汇编指令是否要求CPU2重新加载内存。
以上就是MESI的执行原理MESI协议只能保证并发编程中的可见性并未解决原子性和有序性的问题所以只靠MESI协议是无法完全解决多线程中的所有问题。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback