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

哈尔滨网站建设价位关于网站建设申请

哈尔滨网站建设价位,关于网站建设申请,杭州seo外包,网站后台内容管理作者主页#xff1a;paper jie_博客 本文作者#xff1a;大家好#xff0c;我是paper jie#xff0c;感谢你阅读本文#xff0c;欢迎一建三连哦。 本文于《JavaEE》专栏#xff0c;本专栏是针对于大学生#xff0c;编程小白精心打造的。笔者用重金(时间和精力)打造… 作者主页paper jie_博客 本文作者大家好我是paper jie感谢你阅读本文欢迎一建三连哦。 本文于《JavaEE》专栏本专栏是针对于大学生编程小白精心打造的。笔者用重金(时间和精力)打造将基础知识一网打尽希望可以帮到读者们哦。 其他专栏《MySQL》《C语言》《javaSE》《数据结构》等 内容分享本期将会分享CAS知识. 目录 什么是CAS CAS怎么实现的 CAS的应用 实现原子类 实现自旋锁 CAS的ABA问题 什么是ABA问题 ABA带来的问题 解决方法 什么是CAS CAS称为compare and swap,就是比较和交换的意思,它涉及到的操作就是(内存中的原数据为C, 旧的预期值为A, 需要修改的新值为B.): 1. 比较 A 与 C的值是不是一样 2. 如果相等,就会将B的值写入A中 3.返回操作是否成功. CAS本质上就是一条指令.用来进行比较和交换,而指令本身就具有原子性.基于CAS就给实现线程安全有了一条新的选择. 之前为了线程安全需要加锁,而加锁就可能会造成堵塞.但CAS本身就具有原子性,就不需要加锁,不加锁也就不会造成堵塞.合理的使用CAS也可以解决线程安全的问题. CAS怎么实现的 简答来说就是: Java层面的CAS利用的就是unsafe这个类提供的CAS操作. unsafe的CAS依赖的是JVM针对与不同操作系统实现的Atomic::cmpxchg Atomic::cmpxchg的实现是使用了汇编的CAS操作,且使用CPU硬件提供的lock机制保证其原子性. 反正就是因为硬件提供了支持,软件层面才能做到. CAS的应用 实现原子类 标准库中就提供了Java.cutil.concurrent.atomic 包,里面的类都是基于这种方式来实现的. 典型就是Atomiclnteger类,其中的方法getAndIncrement就是相当于i. AtomicInteger atomicInteger new AtomicInteger(0); // 相当于 i atomicInteger.getAndIncrement(); 伪代码: class AtomicInteger {private int value;public int getAndIncrement() {int oldValue value;while ( CAS(value, oldValue, oldValue1) ! true) {oldValue value;}return oldValue; } 假设两个线程都调用到了这个方法. 1.两个线程都读到了value值到oldvalue中. 2. 线程1先执行CAS操作. 因为value和oldvalue一样,就会直接对value赋值. 3其后线程2再执行CAS操作就会发现value和oldvalue不同就会再次将value的值给oldvalue进入循环 4接下来第二次执行CAS,就发现value和oldvalue一样,就会发生赋值. 通过类似于这种方式就可以实现一个原子类.不需要重量级锁也可以高效的完成多线程的自增操作.(这里其实在代码角度不是原子的,但是在硬件上可以让一条指令完成这个操作,也就变成原子的了) 通过这样的代码就可以实现一个原子类.它是不需要使用重量级锁的,这样可以高效的完成多线程的自增操作. 实现自旋锁 我们基于CAS可以实现更加灵活的锁,获取到更多的控制权. 自旋锁伪代码: 这里核心就是使用CAS,当owner不为null时,它就会一直循环判断,当owner为null时,它就会操作成功,将这个线程的地址赋值给owner,结束了可以调用构造方法来将owner置为null,相当于解锁. 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;}} CAS的ABA问题 什么是ABA问题 我们知道CAS的核心就是比较和交换,判断预期值和内存值是不是一样再交换.但是会有一种情况: 假设有两个线程t1和t2,都需要对一个共享变量num100来进行减50操作. 他们需要进行的步骤: 1. 读取num的值到寄存器中 2.比较看相不相同,相同就修改成50 这时当t1执行到第二步操作时,t2插队进来将这个减50操作完成了,这时num变成了50,后面又有一个t3线程插到t1线程前面,将num的值加50,这时num变成了100.终于轮到t1执行第二步操作时,它发现这个num为100,和寄存器中的值一样,它就会进行50操作. 这就是ABA现象. ABA带来的问题 粗略来看,这样是没有什么影响的.但是再一些极端情况下就会产生一些不好的影响. 比如: 小帅今天打算去银行取50块钱.它对ATM机点了一下,发现没反应,就又点了一下.这时ATM机就会产生t1和t2两个相同的50的线程. 当t1执行到第二步后,t2插队进来执行,将100变成了50.等到t1再执行的时候,它又被插队了,这时小帅的女朋友给它的账户中存了50块钱,账户余额就变成了100.终于等到t1执行时它会发现账户里的值和寄存器中的值一样,于是它的减50操作就成功了. 这就会发生小帅的50块钱不翼而飞的现象. 解决方法 我们可以给需要修改的值引入一个版本号.在比较当前值和预期值时,也要比较版本号相不相同. 1. CAS操作在读取内存值的时候,也需要读取版本号. 2. 在进行比较值的时候,也要比较当前版本号和读取版本号相不相同.相同而修改数据,版本号1.如果当前版本号大于读取的版本号就表示操作失败了. 举个栗子: 比如小帅取钱.取款机都创建了两个线程,都是执行50的操作. t1获取到了存款为100,版本号为1.t2获取到了存款为100,版本号为1. t2扣款成功,存款为50,版本号更新为2. 小帅的女朋友给小帅存了50,存款为100,版本号更新为3. 最终t1执行发现预期值和寄存器值一样,但是当前版本号大于读取版本号,操作失败.
http://www.w-s-a.com/news/877109/

相关文章:

  • 上海建设工程网站大同网站建设熊掌号
  • 设计类书籍网站江苏网站建设简介模板
  • 手机企业网站推广c 手机app开发
  • 网站建设需要多少天凡客建设网站稳定吗
  • 房天下网站建设女生说wap是什么意思
  • 网站开发安全机制北京做网站多少钱合理
  • 扁平化 公司网站建设大型视频网站需要的资金量
  • 免费建各种网站淄博网站建设yx718
  • 凡科网建站入门教程运城市网站建设
  • 黄浦区未成年人思想道德建设网站oa系统是什么
  • 微信里的网站怎么做电子商务网站开发平台
  • 易企秀网站怎么做轮播图网站建设张世勇
  • 网站备案幕布尺寸建立网页的几个步骤
  • pc网站页面找出网站所有死链接
  • 专业做seo的网站网站内连接
  • 阿里云网站开发服务器想开网站建设公司
  • 网站开发不足之处茶叶seo网站推广与优化方案
  • 响应式网站建设系统网站优化怎么做 有什么技巧
  • 班级网站做哪些方面wordpress标签 扩展
  • 如何在电商上购物网站Wordpress 域名授权插件
  • 网站建设后台怎么弄昆明如何做好关键词推广
  • 自己怎么做个网站优酷视频网站开发
  • 2015做网站前景电子商务营销的发展现状
  • 官方网站建设情况说明电子商务网站开发的形式有
  • 网站建设玖金手指排名11专业建站公司建站系统
  • 全球排名前十网站百度网站官网网址
  • 商家在携程旅游网站怎样做宣传做网站公司苏州
  • 芜湖做网站都有哪些广州音乐制作公司
  • 青岛好的网站制作推广注册公司流程步骤
  • 怎么制作营销网站模板wordpress苗木模板