(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)
参考:https://www.cnblogs.com/upnote/p/13193856.html
参考:https://juejin.cn/post/6844903853393985550
参考:https://en.wikipedia.org/wiki/Test-and-set
参考:https://en.wikipedia.org/wiki/Compare-and-swap
参考:https://stackoverflow.com/questions/3659336/compare-and-swap-vs-test-and-set

TAS(Test and Set)与CAS(Compare and Swap),两个重要的硬件同步指令。算是在指令级上,支持各类锁实现的基础存在。

TAS(Test and Set)

test-and-set指令: 作为一个原子不被中断的操作指令,在硬件设计上,仅允许同一时间一个处理器执行该指令,从而保证了它的单一原子性操作。

---from wikipedia:
In computer science, the test-and-set instruction is an instruction used to write 1 (set) to a memory location and return its old value as a single atomic (i.e., non-interruptible) operation. If multiple processes may access the same memory location, and if a process is currently performing a test-and-set, no other process may begin another test-and-set until the first process's test-and-set is finished.

有了硬件保证的只有一个处理器执行该指令,就不用担心多核处理器情况和执行指令的同步困扰。

test-and-set顾名思义,它提供的操作是:

  1. 把给定的内存地址设置为1
  2. 然后返回之前的旧值
 // 伪代码// 只要硬件保证了start,end其间单处理器执行,且不被打断,就算是实现指令的原子性int test_and_set(int* lockPtr){int oldValue;// --- start of atomic segment ---oldValue = *lockPtr;*lockPtr = 1;// --- end of atomic segment ---return oldValue;}

但单纯该指令保证其自身的单一原子操作,而我们需求的是某一部分代码执行的单一原子操作,这就涉及了如何利用TAS的特点,来进行锁的设计。
spinlock自旋锁的样例实现:

// 伪代码
volatile int lock = 0;
void lock(){while(test_and_set(&lock) == 1){}
}
void unlock(){lock = 0;
}
lock();
critical section // only one process can be in the section at a time
unlock();

CAS(Compare and Swap)

In computer science, compare-and-swap (CAS) is an atomic instruction used in multithreading to achieve synchronization.

CAS同样是一个同步指令,主要被用于多线程同步;

它的处理过程类似:

  1. 判断reg上值和输入old值是否一致,一致时改reg值为new
  2. 返回reg上的原值
 // 伪代码// 保证了start,end其间原子执行,就实现了指令的原子性int compare_and_swap(int* regPtr, int old, int new){int org_reg_value;// --- start of atomic segment --- org_reg_value = *regPtr;if (org_reg_value == old){*regPtr = new;}// --- end of atomic segment --- return org_reg_value;}

compare-and-swap,同test-and-set相比,它使用的输入寄存器更多一些,同时它返回值的存储信息也更丰富一些;

  1. test-and-set使用了一个bit位作为目标设定值,表达0/1两个信息量。
  2. compare-and-swap可以用32位或64位作为设定值,输出值,能表达更多的信息量。
    可以用来做原子添加增量值的设置,样例实现:
// 伪代码
int add(&ptr, int add){int org_value = *ptr;while(compare_and_swap(ptr, org_value, org_value+add) != org_value){org_value = *ptr;}return org_value + add;
}

当然也可以用来实现自旋锁,样例实现:

// 伪代码
volatile int lock = 0;
void lock(){while(compare_and_swap(&lock, 0, 1));
}
void unlock(){lock = 0;
}
lock();
critical section // only one process can be in the section at a time
unlock();

(Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu)

TAS与CAS-用于锁的指令支持相关推荐

  1. 对象头、锁的四种状态、Java和处理器实现原子操作的方式(CAS、锁机制;总线锁定、缓存锁定)

    1.对象头 Java对象头里的Mark Word里默认存储对象的HashCode.分代年龄和锁标记位. 32位JVM的Mark Word的默认存储结构如下图所示: 在运行期间,Mark Word里存储 ...

  2. 【重难点】【JUC 04】synchronized 原理、ReentrantLock 原理、synchronized 和 Lock 的对比、CAS 无锁原理

    [重难点][JUC 04]synchronized 原理.ReentrantLock 原理.synchronized 和 Lock 的对比.CAS 无锁原理 文章目录 [重难点][JUC 04]syn ...

  3. Java CAS无锁技术深度解析

    在看AQS代码的时候,看到它很多地方调用了unsafe.compareAndSwapInt这类方法,百度了一下得知这叫CAS无锁技术. CAS原理深度分析 转自:https://blog.csdn.n ...

  4. 深入理解CAS 乐观锁 | Java

    CAS(乐观锁) CAS 全称为 Compare And Swap 翻译过来就是比较并且交换 Synchornized 是悲观锁,线程一旦得到锁,其他的线程就只能挂起了 cas 的操作则是乐观锁,他认 ...

  5. JUC04-- CAS自旋 、CAS自旋锁、ABA问题及解决办法、18大原子类

    文章目录 JUC04 课程任务概览 CAS CAS原理简介 CAS发展: CAS是什么? CAS原理: CAS优点: **CAS底层实现-引出Unsafe类** ==CAS自旋实现个人总结== Ato ...

  6. 面试必备:CAS无锁机制

    CAS无锁机制原理,面试高频问题之一,其实,日常开发中并不会直接使用CAS无锁机制,都是通过一系列封装好的工具类来使用, 说不定面试官不提问,都不知道有这么个东西存在. 1.能说一下你对CAS的理解吗 ...

  7. 深入理解并发编程之CAS无锁机制与ABA问题

    深入理解并发编程之CAS无锁机制与ABA问题 文章目录 深入理解并发编程之CAS无锁机制与ABA问题 前言 一.什么是CAS无锁机制 二.CAS原理分析 1.AtomicLong自增分析 2.基于At ...

  8. CAS无锁队列的实现

    文章目录 1. 基本原理 2. 代码实现 2.1 使用链表实现无锁队列 2.2 使用数组实现环形无锁队列 3. ABA 问题及解决 4. 参考资料 1. 基本原理 源于1994年10月发表在国际并行与 ...

  9. C语言链表无锁化CAS,CAS无锁操作

    主要讲的是<Implementing Lock-Free Queues>的论点,具体直接看论文最好.这里总结些要点. CAS就是Compare And Swap.gcc可以调用: __sy ...

  10. CAS(乐观锁)详细讲解

    CAS(乐观锁) 什么是悲观锁.乐观锁?在Java语言里,总有一些名词看语义跟本不明白是啥玩意儿,也就总有部分面试官拿着这样的词来忽悠面试者,以此来找优越感,其实理解清楚了,这些词也就唬不住人了. s ...

最新文章

  1. HDU3037(卢卡斯定理)
  2. Jenkins配置Java项目1(Java+Maven+Tomcat+SVN/Git)
  3. Linux安装SNMP
  4. LeetCode—210. 课程表 II
  5. [html] table中给td设置宽度无效怎么解决?
  6. AdaX:一个比Adam更优秀,带”长期记忆“的优化器
  7. 出现ping: unknown host www.baidu.com 问题解决
  8. Know more about Oracle Latches
  9. 欧盟:2020年之前普及免费WiFi网络
  10. Wpf ListBox数据绑定实例1--绑定字典集合
  11. bootstrap带图标的按钮与图标做连接
  12. Dapper.net 入门demo 轻量级ORM框架
  13. 1.《Spring学习笔记-MVC》系列文章,讲解返回json数据的文章共有3篇,分别为:...
  14. javascript查看详情与收起详情
  15. 全国地表径流量数据获取/植被类型数据/NPP数据/土壤侵蚀数据/土壤质地分类/降雨量栅格数据/太阳辐射量数据
  16. 红警ol服务器维护中1003,红警OL频繁掉线怎们么办 网络断开连接解决办法
  17. Hugepages详解
  18. mp4视频怎么转换成华为P10手机适配的分辨率
  19. 自控力lesson14书摘——克服‘紧张症’的法则
  20. 存储洞察:从技术到市场

热门文章

  1. 农历 阴历 转换阳历算法
  2. 魔百盒B863AV3.2-M,B863AV3.1-M2线刷+卡刷精简固件(S905L3A-B)
  3. Novell NetWare 及其协议
  4. 有趣的符号图画(颜文字)(I have a AC dream)(神兽护体)(保佑你次次Accepted)
  5. 为什么要使用Tomcat?
  6. 跑路潮来临:解散社群,深夜遁逃,卷走百亿资金
  7. 怎么p出模糊的照片_照片模糊了怎么办 如何利用美图秀秀变清晰
  8. 如何寻找综述性论文?
  9. php怎么把图片设置为背景,ppt怎么把图片设为背景
  10. 基于DNN的IMDB电影数据集文本分类