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

医疗机构网站以患者做宣传/网上营销新观察网

医疗机构网站以患者做宣传,网上营销新观察网,建设网站前需考虑哪些问题,软件开发工作流程1 什么叫做CAS? CAS(compare and swap)比较并交换,在平时开发中其实很多底层都是用cas来实现的,像原子类的底层原理就是cas,乐观锁的底层原理也是cas。原子类的用法可见下面这篇博客 volatile ~原子类_IT…

1 什么叫做CAS?

CAS(compare and swap)比较并交换,在平时开发中其实很多底层都是用cas来实现的,像原子类的底层原理就是cas,乐观锁的底层原理也是cas。原子类的用法可见下面这篇博客

volatile ~原子类_IT盛夏的果实的博客-CSDN博客

cas的特点:当多个线程同时使用cas去更新一个变量的时候,只有其中一个线程能够操作成功,其他的线程都能够操作失败,但是更新失败的线程不会阻塞,但失败的线程会自旋尝试更新(默认都有尝试更新的次数)。

CAS中的核心操作:内存值V、预期值A、要修改的值B。当且仅当预期值A和当前的内存值V相等时才会将内存值修改为B。

2 CAS带来了什么问题?

CAS带来的ABA问题

比如线程1已经将利用CAS修改变量值A,但是在修改之前其他线程已经将A变成了B,然后又变成了A,即A->B->A问题。因为线程1在操作的时候发现值依然为A,所以根据CAS的机制会操作成功,但是其实这个值已经被其他线程修改过了,只是线程1不知道而已,这就导致了ABA问题。

demo实例:

    private static AtomicReference<Integer> atomicInteger = new AtomicReference(100);public static void main(String[] args) throws InterruptedException {System.out.println("=================以下是ABA问题产生==========================");new Thread(() -> {atomicInteger.compareAndSet(100, 101);atomicInteger.compareAndSet(101, 100);},"t1").start();new Thread(() -> {try {//暂停1s中t2线程,保证了上面的t1线程完成了一次ABA操作(当main// 线程启动之后,t1线程和t2线程不知道谁先执行,所以让t2线程先睡1秒,这样即使t2线程先执行的情况下。睡1s时,也会被t1线程抢到完成一次ABA的操作)TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}boolean result = atomicInteger.compareAndSet(100, 2022);System.out.println("是否修改成功:" + result +"\t"+"修改之后的值为"+atomicInteger.get());},"t2").start();}

由demo可以看到两个线程,第一个线程将100改为101后,又将101改为了100,线程2依然可以将100改为其他的值(2022)。所以说CAS的确带来了ABA问题。

 3 如何解决ABA问题?

在java中,AtomicStampedReference通过包装[E,Integer]的元组来对象对象标记版本戳stamp,从而避免ABA问题。

demo示例:

private static AtomicReference<Integer> atomicInteger = new AtomicReference(100);private static AtomicStampedReference<Integer> atomicStampedReference = new AtomicStampedReference<Integer>(100,1);public static void main(String[] args) throws InterruptedException {System.out.println("=================以下是ABA问题产生==========================");new Thread(() -> {atomicInteger.compareAndSet(100, 101);atomicInteger.compareAndSet(101, 100);},"t1").start();new Thread(() -> {try {//暂停1s中t2线程,保证了上面的t1线程完成了一次ABA操作(当main// 线程启动之后,t1线程和t2线程不知道谁先执行,所以让t2线程先睡1秒,这样即使t2线程先执行的情况下。睡1s时,也会被t1线程抢到完成一次ABA的操作)TimeUnit.SECONDS.sleep(1);} catch (InterruptedException e) {e.printStackTrace();}boolean result = atomicInteger.compareAndSet(100, 101);System.out.println("是否修改成功:" + result +"\t"+"修改之后的值为"+atomicInteger.get());},"t2").start();try { TimeUnit.SECONDS.sleep(2); } catch (InterruptedException e) {}System.out.println("=================以下是ABA问题的解决==========================");new Thread(() -> {//拿到此时版本号int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName()+"\t第1次版本号为"+stamp);//暂停1s钟t3线程,让cpu去调度t4线程拿到同一个初始版本号try { TimeUnit.SECONDS.sleep(1); } catch (InterruptedException e) {}//将100设置成101并增加版本号atomicStampedReference.compareAndSet(100, 101, atomicStampedReference.getStamp(),atomicStampedReference.getStamp() + 1);System.out.println(Thread.currentThread().getName()+"\t第2次版本号为"+atomicStampedReference.getStamp());//将101设置成100并增加版本号atomicStampedReference.compareAndSet(101, 100, atomicStampedReference.getStamp(),atomicStampedReference.getStamp() + 1);System.out.println(Thread.currentThread().getName()+"\t第3次版本号为"+atomicStampedReference.getStamp());},"t3线程").start();new Thread(() -> {//拿到此时版本号int stamp = atomicStampedReference.getStamp();System.out.println(Thread.currentThread().getName()+"\t第1次版本号为"+stamp);//暂停t4线程3秒钟,保证t3线程完成一次ABA操作try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) { }//将100设置成101并增加版本号boolean refResult = atomicStampedReference.compareAndSet(100, 2021, stamp, stamp + 1);System.out.println("是否修改成功:" + refResult +"\t"+"实际最新值为"+atomicStampedReference.getReference()+"\t"+"当前实际版本号为:"+atomicStampedReference.getStamp());},"t4线程").start();

控制台输出:

  可以看出,加入了版本号控制,解决了ABA的问题

4 CAS有什么缺点?

1)ABA问题

2)循环时间长,开销较大

http://www.lbrq.cn/news/1433863.html

相关文章:

  • 烟台做网站建设电话/惠州seo排名外包
  • 网站推广的名词解释/网络营销评价的名词解释
  • 深圳网站设计兴田德润i简介/代写企业软文
  • 长沙做网站备案/百度收录怎么查询
  • 个人网站建设法律规定/qq群排名优化软件
  • 长沙网站建设开发/深圳网站优化推广方案
  • 太原金茂大厦做网站的/品牌推广公司
  • 温州网站制作网站/营销必备十大软件
  • 重庆微信网站建设价格/软文街官方网站
  • 网站建设包括的内容/百度指数查询
  • 专业的网站制作中心/微信上怎么做广告推广
  • 西安网站建设 玖佰网络/品牌营销策略四种类型
  • wordpress 如何搬家/阳城seo排名
  • 网站主服务器所在地地址/广告推广平台赚取佣金
  • 如何建设一个网站/seo免费入门教程
  • 做网站租服务器需要多少钱/深圳seo优化外包公司
  • wordpress清新文艺主题/单页网站seo如何优化
  • 网站静态代码检查 站长工具/大批量刷关键词排名软件
  • 网站建设开发票开什么品名/网站前期推广
  • sns网站设计/爱站权重查询
  • 网站建设公司小程序开发/百度seo白皮书
  • 长春网站优化/it培训班真的有用吗
  • 在网上可以做宣传的有那些网站/互联网推广引流公司
  • 做网站用空间好还是服务器好/赣州seo外包
  • 做网站的空间是什么/免费发布友链
  • 网站开发预留接口/2023年的新闻十条
  • 微信html5模板网站/软文广告经典案例600
  • 网站建设需要什么硬件/网站优化排名方案
  • 设计网站免费的/最新小组排名
  • 公司线上推广/疫情优化调整
  • 待办事项小程序开发
  • dkms安装nvidia驱动和多内核支持
  • K8s学习----Namespace:资源隔离与环境管理的核心机制
  • 基于UniApp的智能在线客服系统前端设计与实现
  • Git核心机制:工作区、暂存区与版本库
  • 一键自动化:Kickstart无人值守安装指南