当前位置: 首页 > news >正文

拖拽式网站开发企腾网

拖拽式网站开发,企腾网,公司网站维护怎么维护,绵阳市建设工程监督网站目录 #x1f388;什么是 CAS #x1f4dd;CAS 伪代码 #x1f388;CAS 是怎么实现的 #x1f388;CAS 有哪些应用 #x1f6a9;实现原子类 #x1f308;伪代码实现: #x1f6a9;实现自旋锁 #x1f308;自旋锁伪代码 #x1f388;CAS 的 ABA 问题 #…目录 什么是 CAS CAS 伪代码  CAS 是怎么实现的 CAS 有哪些应用 实现原子类 伪代码实现: 实现自旋锁 自旋锁伪代码 CAS 的 ABA 问题 什么是 ABA 问题 ABA 问题引来的 BUG CAS相关面试题 什么是 CAS CAS: 全称 Compare and swap 字面意思 :” 比较并交换 “ 一个 CAS 涉及到以下操作: 我们假设内存中的原数据V旧的预期值A需要修改的新值B。 1. 比较 A 与 V 是否相等。比较 2. 如果比较相等将 B 写入 V。交换 3. 返回操作是否成功。 CAS 比较交换的是 内存 和 寄存器。比如有一个内存M现在有俩个寄存器AB. CAS(M,A,B如果M和A的值相同的话就把M和B的值交换同时整个操作返回true.                      如果M和A的值不同的话无事发生同时整个操作返回false. CAS 伪代码  伪代码 代码是不能真正编译执行不符合语法要求) 认识到逻辑是啥样的。 下面写的代码不是原子的, 真实的 CAS 是一个原子的硬件指令完成的. 这个伪代码只是辅助理解 CAS 的工作流程. boolean CAS(address, expectValue, swapValue) { if (address expectedValue) {address swapValue;return true;}return false; } 两种典型的不是 原子性 的代码 1. check and set (if 判定然后设定值) [上面的 CAS 伪代码就是这种形式] 2. read and update (i) [之前我们讲线程安全的代码例子是这种形式] 当多个线程同时对某个资源进行 CAS 操作只能有一个线程操作成功但是并不会阻塞其他线程 , 其他线程只会收到操作失败的信号。 CAS 可以视为是一种乐观锁. (或者可以理解成 CAS 是乐观锁的一种实现方式) CAS其实是一个cpu指令一个cpu指令就能完成上述比较交换的逻辑单个cpu指令是原子的就可以使用CAS完成一些操作进一步的替代加锁。——这样就给编写线程安全的代码引入了新的思路。 基于CAS实现线程安全的方式也称为无锁编程, 优点保证线程安全同时避免阻塞(效率缺点代码会更复杂不好理解只能够适合一些特定的场景不如加锁方式更普实。 CAS 是怎么实现的 CAS本质上是cpu提供的指令——》又被操作系统封装提供成api然后又被JVM也提供成api——》程序员就可以使用了。 针对不同的操作系统 JVM 用到了不同的 CAS 实现原理简单来讲 java 的 CAS 利用的的是 unsafe 这个类提供的 CAS 操作 unsafe 的 CAS 依赖了的是 jvm 针对不同的操作系统实现的 Atomic::cmpxchg Atomic::cmpxchg 的实现使用了汇编的 CAS 操作并使用 cpu 硬件提供的 lock 机制保证其原子性。 简而言之是因为 硬件予以了支持软件层面才能做到。 等到后面会更加能理解。 CAS 有哪些应用 实现原子类 int 进行不是原子的loadaddsave)三步骤。 AtomicInteger,基于CAS的方式对int进行封装此时进行就是原子的了。操作是基于CAS指令实现的 标准库中提供了 java.util.concurrent.atomic 包, 里面的类都是基于这种方式来实现的. 典型的就是 AtomicInteger 类. 其中的 getAndIncrement 相当于 i 操作. 在java中有些操作是偏底层的操作偏底层的操作在使用的时候有更多的注意事项稍有不慎就容易写出问题。这些操作就会放到unsafe中进行归类。 unsafe代表有更多的注意事项稍有不慎就写错。就比如在导航的时候遇到事故多发地方就会提醒警告信息 我们看到原子类内部没有使用synchronized加锁使用。 native是本地方法compareAndSwapInt比较和交换JVM源码中使用c实现逻辑底层的操作。 从上面流程我们可以看到CAS中cpu指令 先是通过系统进行封装提供了api(getAndSetInt),然后JVM进行封装提供apicompareAndSwapInt。而原子类是基于CAS实现的。 原子类里面基于CAS实现的。                                                                                          通过利用指令原子性逻辑获取锁实现原子性操作。 伪代码实现: class AtomicInteger {private int value;public int getAndIncrement() {int oldValue value;while ( CAS(value, oldValue, oldValue1) ! true) {oldValue value;}return oldValue;} } 初始情况下value的值是0俩次自增结果是2. 如果俩者相等就返回true,并且让oldValue1赋值给value让value1如果不相等就得让value赋值给oldvalue然后进行操作。 所以我们之前所说的”线程不安全“本质上是进行自增的过程中穿插执行了。 CAS也是让这里的自增不要穿插执行核心思路和加锁是类似的加锁是通过阻塞的方式避免穿插CAS则是会通过重试的方式避免穿插。 实现自旋锁 基于 CAS 实现更灵活的锁 , 获取到更多的控制权 . 自旋锁伪代码 public class SpinLock {private Thread owner null;public void lock(){// 通过 CAS 看当前锁是否被某个线程持有. // 如果这个锁已经被别的线程持有, 那么就自旋等待. // 如果这个锁没有被别的线程持有, 那么就把 owner 设为当前尝试加锁的线程. while(!CAS(this.owner, null, Thread.currentThread())){}}public void unlock (){this.owner null;} } 记录当前这个锁被哪个线程获取到了如果是null表示未加锁状态。 CAS 的 ABA 问题 什么是 ABA 问题 ABA 的关键问题 : 是通过值没有发生改变来作为”没有其他线程穿插执行“判定依据。 但是这种判定方式不够严谨更极端的情况下可能有另一个线程穿插进来把值从A-B-A,针对第一个线程来说看起来好像是这个值没变实际上已经被穿插执行了。 比如买个手机买到的是一个”二手的翻新的设备“。翻新机也不是不能用里面可能会有一些暗伤。 ABA问题如果真的出现了其实大部分情况下是不会产生bug的就相当于买到二手设备也是能用的虽然另一个线程穿插执行了由于值又改回来了此时逻辑上也不一定会产生bug。 ABA 问题引来的 BUG 假设这个场景我去ATM取钱我本身的账户1000我想要取500我再取钱的过程中出现bug了我按下取钱按钮的时候没反应又按了一下此时就产生了俩个线程进行扣款操作。 由于t3线程正好又在这个节骨眼上转来了500与时我的余额又是1000了就会导致t1线程也能扣款。此时我预期取500实际上扣了1000. 大部分情况下ABA问题其实没啥大事但是有一些极端情况会使ABA出现bug只要让判定的数值按照一个方向增长即可。有增有减就可能出现ABA只是增加或者只是减少针对像账户余额这样概念本身就应该要能增有减可以引入一个额外的变量版本号约定每次修改余额就让版本号自增此时在使用CAS判定的时候就不是直接判定余额了而是判定版本号看版本号是否是变化了如果版本号不变注定没有线程穿插了执行。 相关面试题 1) 讲解下你自己理解的 CAS 机制 compareAndSwap 比较并且交换相当于一个原子操作同时完成  读取内存, 比 较是否相等, 修改内存 这三个步骤. 本质上需要 CPU 指令的支撑。通过利用指令的原子性从而避免获取锁实现了原子性操作。 2) ABA问题怎么解决 给要修改的变量添加一个版本号在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期.如果发现当前版本号和之前读到的版本号一致, 就真正执行修改操作, 并让版本号自增; 如果发现当前版本号比之前读到的版本号大, 就认为操作失败 难道父母眼里只有学习学习嘛
http://www.hkea.cn/news/14521079/

相关文章:

  • 科技网络网站建设网站建设归工商局管还是工信局管
  • 网站的logo怎么上传二手市场网站建设的目的
  • 在线课堂手机网站模板网站模板破解下载
  • 华夏名网修改网站信息绵阳网站建设企业
  • 网站职业技术培训学校注册公司怎么注册
  • 接外包项目的网站免费虚拟空间wordpress
  • 做网站打算套用模板东莞网络营销外包价格
  • 鸿安建设集团网站家在深圳房产论坛
  • 备案网站系统个人网站推广广告
  • 怀化网站建设怎么收费教学直播平台网站建设费用
  • 网站设计师要求西安平面设计公司排行
  • 哈尔滨营销型网站建设公司php做网站需要的技术
  • 阳春县建设局网站wordpress 支付宝企业
  • 巩义便宜网站建设网站开发建设企业
  • 西昌规划和建设局网站信息手机网站模板下载软件
  • 全国 网站备案 数量上海徐汇区网站建设
  • 网站建设 调研报告公司网络优化方案
  • 漳州微网站建设价格宁波建设
  • 建设商场黄金网站网站设计理念怎么写
  • 网站的优化网站开发路线
  • 网站建设中图片电话百度搜索下载
  • 做网站教程百度云百度seo站长工具
  • 南宁网站优化公司哪家好外贸seo推广公司
  • 怎么叫人做网站网络推广浏览目标
  • 有那个网站做简历模板wordpress怎么输代码
  • 手机开发框架seo网站页面诊断
  • 做门的网站wordpress小工具宽度
  • 免费自己制作logo的网站公司网站建设总结报告
  • 上海app网站建设渭南网站建设价格
  • 电子商务网站建设林锋课本答案安卓app下载平台