首页 > 编程知识 正文

cas教程,cas机制

时间:2023-05-04 01:32:17 阅读:186833 作者:4133

1 .关于cas操作的开始,首先要理解一些术语

2 .处理器如何实现原子操作

32位IA-32处理器使用基于高速缓存锁或总线锁的方法来提供多处理器之间的原子操作。 首先,处理器自动保证基本的存储器操作的原子性。 确保处理器从系统内存中读取或写入一个字节意味着,当一个处理器读取一个字节时,其他处理器无法访问该字节的存储器地址。

2.1总线锁

当多个处理器对共享变量一并进行读写操作时,I是典型的读写操作。 该读改写操作不是原子的。 如上图所示,各处理器将I的值读入自己的处理器高速缓存,操作各个高速缓存内的I的值,分别写入系统存储器,从而产生了问题。 因为对共享变量的读写操作也是原子的,所以在CPU1对共享变量进行读写的期间,CPU2必须保证不能操作该共享变量的存储器地址的高速缓存行。

的总线锁用于保证原子性。 总线锁定是指,如果某个处理器使用处理器提供的LOCK #信号将此信号输出到总线,而其他处理器的请求被阻止,则该处理器可以独占共享内存。

2.2高速缓存锁定

在同一时刻,只要保证对某个存储器地址的操作是原子的就可以了,总线锁会锁定CPU和存储器之间的通信。 这样会增加总线锁定的开销,因为在锁定期间,其他处理器无法操作其他存储器地址的数据。

由于常用内存高速缓存在处理器的L1、L2和L3高速缓存中,因此原子操作可以直接在处理器内部高速缓存中进行,而无需声明总线锁定。

高速缓存锁定是指当一个处理器的高速缓存写回内存时,其他处理器的高速缓存将失效。 例如,在多核处理器中,在奔腾和P6文件处理中,通过嗅探某个处理器检测到其它处理器正尝试写入存储器地址,且如果当前共享该地址,则嗅探的处理器可进行跳跃

但是,高速缓存锁不可用的情况有两种。 一种是无法在处理器上缓存的数据,另一种是跨越多条缓存线的数据。 某些处理器不支持高速缓存锁定。

在Java中可以使用锁和循环CAS进行原子操作

自旋CAS的基本思路是循环进行CAS操作,直到成功。

在JDK1.5之后,为JDK合并订单提供了支持原子操作的类。 例如,AtomicBoolean、AtomicInteger和AtomicLong都以原子方式更新指定类型的值。 例如,AtomicInteger可以按如下方式使用:

atomicintegeratomicinteger=newatomicinteger (0; int i=atomicInteger.get (; atomicinteger.compareandset(I,I ); 123CAS还存在以下三个问题:

)1) ABA问题。 如果某个值是a,但变成b,又变成a,使用CAS检查时,该值没有变化,但实际上发生了。 ABA的解决思路是使用版本号,在变量前添加版本号,从而使A——B——A为1A——2B——3A。

)循环时间长,开销大

)3)公共变量的原子操作只能保证一个。 也就是说,多个共享变量操作时,循环CAS将无法保证操作的原子性。 但是,从JDK1.5开始,JDK提供了AtomicReference类以保证引用对象之间的原子性,并允许将多个变量组合到一个对象中进行CAS操作。

转载于https://blog.csdn.net/QQ _ 35357656/article/details/78657373

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。