CAS指令
public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5); public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5); public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);
#define FN_PTR(f) CAST_FROM_FN_PTR(void*, &f)
{CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z", FN_PTR(Unsafe_CompareAndSwapObject)},
{CC"compareAndSwapInt", CC"("OBJ"J""I""I"")Z", FN_PTR(Unsafe_CompareAndSwapInt)},
{CC"compareAndSwapLong", CC"("OBJ"J""J""J"")Z", FN_PTR(Unsafe_CompareAndSwapLong)},
1 jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte*dest, jbyte compare_value) {
2 assert (sizeof(jbyte) == 1,"assumption.");
3 uintptr_t dest_addr = (uintptr_t) dest;
4 uintptr_t offset = dest_addr % sizeof(jint);
5 volatile jint*dest_int = ( volatile jint*)(dest_addr - offset);
6 // 对象当前值
7 jint cur = *dest_int;
8 // 当前值cur的地址
9 jbyte * cur_as_bytes = (jbyte *) ( & cur);
10 // new_val地址
11 jint new_val = cur;
12 jbyte * new_val_as_bytes = (jbyte *) ( & new_val);
13 // new_val存exchange_value,后面修改则直接从new_val中取值
14 new_val_as_bytes[offset] = exchange_value;
15 // 比较当前值与期望值,如果相同则更新,不同则直接返回
16 while (cur_as_bytes[offset] == compare_value) {
17 // 调用汇编指令cmpxchg执行CAS操作,期望值为cur,更新值为new_val
18 jint res = cmpxchg(new_val, dest_int, cur);
19 if (res == cur) break;
20 cur = res;
21 new_val = cur;
22 new_val_as_bytes[offset] = exchange_value;
23 }
24 // 返回当前值
25 return cur_as_bytes[offset];
26 }
1 // 类的定义:
2 public class AtomicStampedReference<V>
3 // 构造函数,将对象和标记值传入
4 public AtomicStampedReference(V initialRef, int initialStamp) {
5 pair = Pair.of(initialRef, initialStamp);
6 }
7 // 参数代表的含义分别是 期望值,写入的新值,期望标记,新标记值
8 public boolean compareAndSet(V expectedReference,
9 V newReference,
10 int expectedStamp,
11 int newStamp) {
12 Pair<V> current = pair;
13 // 比较原对象的同时比较版本号是否也相同,如果都相同则进行pair的cas操作
14 return
15 expectedReference == current.reference &&
16 expectedStamp == current.stamp &&
17 ((newReference == current.reference &&
18 newStamp == current.stamp) ||
19 casPair(current, Pair.of(newReference, newStamp)));
20 }
21 // 如果在这之前已经有线程对pair进行更新,则会执行失败
22 private boolean casPair(Pair<V> cmp, Pair<V> val) {
23 return UNSAFE.compareAndSwapObject(this, pairOffset, cmp, val);
24 }
25 public V getRerference();
26 public int getStamp();
27 public void set(V newReference,int newStamp);
CAS指令的更多相关文章
- 硬件对同步的支持-TAS和CAS指令
目录 Test and Set Compare and Swap 使用CAS实现线程安全的数据结构. 现在主流的多处理器架构都在硬件水平上提供了对并发同步的支持. 今天我们讨论两个很重要的硬件同步指令 ...
- 从ObjectPool到CAS指令
相信最近看过我的文章的朋友对于Microsoft.Extensions.ObjectPool不陌生:复用.池化是在很多高性能场景的优化技巧,它能减少内存占用率.降低GC频率.提升系统TPS和降低请求时 ...
- Netty的并发编程实践3:CAS指令和原子类
互斥同步最主要的问题就是进行线程阻塞和唤醒所带来的性能的额外损耗,因此这种同步被称为阻塞同步,它属于一种悲观的并发策略,我们称之为悲观锁.随着硬件和操作系统指令集的发展和优化,产生了非阻塞同步,被称为 ...
- Java的多线程机制系列:(二)缓存一致性和CAS
一.总线锁定和缓存一致性 这是两个操作系统层面的概念.随着多核时代的到来,并发操作已经成了很正常的现象,操作系统必须要有一些机制和原语,以保证某些基本操作的原子性.首先处理器需要保证读一个字节或写一个 ...
- JAVA CAS原理深度分析-转载
参考文档: http://www.blogjava.net/xylz/archive/2010/07/04/325206.html http://blog.hesey.net/2011/09/reso ...
- [数据库事务与锁]详解八:底理解数据库事务乐观锁的一种实现方式——CAS
注明: 本文转载自http://www.hollischuang.com/archives/1537 在深入理解乐观锁与悲观锁一文中我们介绍过锁.本文在这篇文章的基础上,深入分析一下乐观锁的实现机制, ...
- 非阻塞同步算法与CAS(Compare and Swap)无锁算法
锁(lock)的代价 锁是用来做并发最简单的方式,当然其代价也是最高的.内核态的锁的时候需要操作系统进行一次上下文切换,加锁.释放锁会导致比较多的上下文切换和调度延时,等待锁的线程会被挂起直至锁释放. ...
- 并发中的Native方法,CAS操作与ABA问题
Native方法,Unsafe与CAS操作 >>JNI和Native方法 Java中,通过JNI(Java Native Interface,java本地接口)来实现本地化,访问操作系统底 ...
- JAVA CAS原理
转自: http://blog.csdn.net/hsuxu/article/details/9467651 CAS CAS: Compare and Swap java.util.concurren ...
随机推荐
- Java并发编程之同步辅助类
CountDownLatch 在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待,基于AbstractQueuedSynchronizer实现,state初始化为count,每cou ...
- DenseNet的个人总结
DenseNet这篇论文是在ResNet之后一年发表的,由于ResNet在当时引起了很大的轰动,所以DenseNet也将ResNet作为了主要的对比方法,读起来还是比较容易的,全篇只有两个数学公式,也 ...
- 3w 字长文爆肝 Java 基础面试题!太顶了!!!
hey guys ,这不是也到了面试季了么,cxuan 又打算重新写一下 Java 相关的面试题,先从基础的开始吧,这些面试题属于基础系列,不包含多线程相关面试题和 JVM 相关面试题,多线程和 JV ...
- [Fundamental of Power Electronics]-PART I-1.引言-1.1 功率处理概论
1.1 功率处理概论 电力电子领域关注的是利用电子设备对电力进行处理[1–7].如图1.1所示,其中关键部件就是开关变换器.通常,开关变换器包含电源输入和控制输入端口以及电源输出端口.原始输入功率按控 ...
- canvas判断点是否在路径内
应用场景 我们的项目中有个功能是,canvas上的某个图片选中后可以再这个图片上用鼠标拖拽绘制画笔线条. 当然绘制的边界要控制在图片大小范围内的,那么鼠标是可以随意动的,怎么能控制只在图片上的时候才绘 ...
- 使用CSS3中Canvas 实现两张图片合成一张图片【常用于合成二维码图片】
CSS3 Canvas 实现两张图片合成一张图片 需求 需求:在项目中遇到将一张固定图片和一张二维码图片合成一张新图片,并且用户能够将图片保存下载到本地. 思路:使用 CSS3 中的 Canvas 将 ...
- Spring Boot 2.3 新特性优雅停机详解
什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController { @GetMapping("/demo") p ...
- Go-41-回调
回调函数,函数有一个参数是函数类型,这个函数就是回调函数 回调函数,可以实现多态,即调用同一个接口,不同的表现,可以实现不同表现 package main import "fmt" ...
- java连接数据库(jdbc)的标准规范
java连接数据库的标准规范 JDBC全称:java database connectivity ,是sun公司提供的Java连接数据库的标准规范. localhost和127.0.0.1 都是表示当 ...
- Cube painting UVA - 253
We have a machine for painting cubes. It is supplied with three different colors: blue, red and gre ...