多线程 – 为什么CompareAndSwap指令被认为是昂贵的?

前端之家收集整理的这篇文章主要介绍了多线程 – 为什么CompareAndSwap指令被认为是昂贵的?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
为什么CompareAndSwap指令被认为是昂贵的?

我读了一本书:

“记忆障碍是昂贵的,就像
昂贵的原子compareAndSet()
指令.”

谢谢!

解决方法

“CAS”与一般商店没有什么不同,有些关于CAS的错误信息可能来自于在Intel处理器上原来执行的锁:cmpxchg(CAS),锁定:前缀导致LOCK#信号被断言,访问公共汽车,这当然没有规模.随后的锁定实现:cmpxchg利用高速缓存一致性协议 – 通常是基于窥探的MESI,而不是断言LOCK#. – David Dice,Biased locking in HotSpot

“Memory barriers are expensive,about as expensive as an atomic compareAndSet() instruction.”

这是真的
例如.在x86上,多处理器系统上的正确CAS具有锁定前缀.
锁前缀导致完整的内存障碍:

“…locked operations serialize all outstanding load and store operations (that is,wait for them to complete).” …”Locked operations are atomic with respect to all other memory operations and all externally visible events. Only instruction fetch and page table accesses can pass locked instructions. Locked instructions can be used to synchronize data written by one processor and read by another processor.” – 07001,Chapter 8.1.2.

实际上,存储器屏障实现为虚拟LOCK OR或LOCK,并且在x86 / x64上的the .NETthe JAVA JIT中实现.
在x86上,CAS导致完整的内存障碍.

在PPC上,它是不同的. LL/SC对 – lwarx & stwcx – 可用于将内存操作数加载到寄存器中,如果目标位置没有其他存储,则将其写回,或者如果存在则重试整个循环. LL / SC可以中断.
它也不意味着一个自动的全屏障.
性能特征和行为在不同架构上可能会有很大差异.
但再次 – weak LL/SC不是CAS.

猜你在找的Java相关文章