【从ObjectPool到CAS指令】共享态(Shared),意味着该 Cache Line 可能在多个 Cache 中都有备份 , 并且是相同的状态,它是和内存内容保持一致的一份拷贝 , 而且可以在任何时候都变成其他三种状态 。
失效态(Invalid),该 Cache Line 要么已经不在 Cache 中,要么它的内容已经过时 。一旦某个Cache Line 被标记为失效 , 那它就被当作从来没被加载到 Cache 中 。总得来说,若干个CPU核心通过Ringbus连到一起 。每个核心都维护自己的Cache的状态 。如果对于同一份内存数据在多个核里都有Cache,则状态都为S(Shared) 。
一旦有一核心改了这个数据(状态变成了M),其他核心就能瞬间通过Ringbus感知到这个修改,从而把自己的Cache状态变成I(Invalid) , 并且从标记为M的Cache中读过来 。同时,这个数据会被原子的写回到主存 。最终,Cache的状态又会变为S 。
关于
MESI
协议更详细的信息就不在本文中介绍了 , 在计算机操作系统和体系结构相关书籍和资料中有更详细的介绍 。然后
compxchg
这个指令就很简单了,和我们之前提到的一样,比较两个地址中的值是否相等 , 如果相等的话那么就修改 。Interlocked
类中的其它方法也是同样的原理,我们可以看看Add
之类的方法,同样是在对应的操作指令前加了lock
指令 。
文章插图
总结本文主要是带大家看了下
ObjectPool
的源码 , 然后看了看ObjectPool
能实现无锁线程安全的最大功臣Interlocked.CompareExchange
方法;然后通过汇编代码了解了一下Interlocked
类中的一些方法是如何做到原子性的 。感谢阅读,如果您觉得本文还不错,欢迎点赞、转发+评论 , 您的支持是我更新的动力!
推荐阅读
- 蜘蛛的丝是从哪里吐出来的?
- .net 温故知新:【8】.NET 中的配置从xml转向json
- Android10 dex2oat实践
- Spark简单介绍,Windows下安装Scala+Hadoop+Spark运行环境,集成到IDEA中
- 为什么剪指甲时不会感到疼?
- iqoo7电池多大_iqoo7电池多少毫安
- 12306购票卧铺如何订下铺(12306硬卧如何买到下铺)
- 12306怎么才能选到下铺(12306怎么买硬卧下铺)
- 12306如何订到下铺(打12306可以订到下铺吗)
- 微信好友删除了怎么找回(微信注销60天后警察还能查到吗)