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安装第一步JDK
安装JDK----(一学就会) 一.百度搜索JDK,找到下载的地址 二.下载属于自己电脑的对应版本 三.下载到本地之后,双击安装JDK 四.配置环境变量 我的电脑->右键->属性 环境变量 ...
- 前后端(PHP)使用AES对称加密
前端代码: // 这个是加密用的 function encrypt(text){ var key = CryptoJS.enc.Utf8.parse('1234567890654321'); //为了 ...
- 微信小程序实现搜索关键词高亮
目录 1,前言 2,思路 3,代码逻辑 1,前言 项目中碰到一个需求,搜索数据并且关键词要高亮显示,接到需求,马上开干.先上效果图.源码已经做成了小程序代码片段,放入了GitHub了,文章底部有源码链 ...
- 【软件推荐】使用Cmder替换Windows自带的控制台
安装地址 进入cmder官网,下载相应版本. 如果本地已经安装了git,可以选择mini版本. 将 λ 替换为 $ 当前cmder默认的提示符是λ,看上去总是有点不习惯. 打开cmder目录下的ven ...
- 201871030116-李小龙 实验二 个人项目—《D{0-1} KP》项目报告
项目 内容 课程班级博客链接 https://edu.cnblogs.com/campus/xbsf/2018CST 这个作业要求链接 https://www.cnblogs.com/nwnu-dai ...
- Dynamics CRM报表提示rsProcessingAborted解决方法
有时候CRM用的好好的突然报表提示了一个错误,rsProcessingAborted如下图: 开始以为是权限问题,在数据库捣鼓了很长时间,服务也重启了很多遍都没效果.后来试了一下重新安装一下报表服务器 ...
- 2020 OO 第三单元总结 JML语言
title: 2020 OO 第三单元总结 date: 2020-05-21 10:10:06 tags: OO categories: 学习 第三单元终于结束了,这是我目前为止最惨的一单元,第十次作 ...
- ASP.NET Core可视化日志组件使用
前言 今天站长推荐一款日志可视化组件LogDashboard,可以不用安装第三方进程,只需要在项目中安装相应的Nuget包,添加数行代码,就可以实现拥有带Web页面的日志管理面板,十分nice哦. 下 ...
- MySQL数据库高级一:架构介绍
两天半就可以 严禁使用 精通 在简历上 了解的越多,越比他人有优势 linux的mysql需要使用中文字符集那么就要修改配置文件 1.mysql的linux版 安装和卸载不说了 2.逻辑架构 总体概况 ...
- 【spring源码系列】之【xml解析】
1. 读源码的方法 java程序员都知道读源码的重要性,尤其是spring的源码,代码设计不仅优雅,而且功能越来越强大,几乎可以与很多开源框架整合,让应用更易于专注业务领域开发.但是能把spring的 ...