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

流量统计网站推广法网站建设大致分哪几个板块

流量统计网站推广法,网站建设大致分哪几个板块,系统开发外包,购物网站成功案例前言 CAS指的是Compare-And-Swap#xff08;比较与交换#xff09;#xff0c;它是一种多线程同步的技术#xff0c;常用于实现无锁算法#xff0c;从而提高多线程程序的性能和扩展性。本篇文章具体讲解如何使用 CAS 的机制以及 CAS 机制带来的问题。 目录 1. 什么是CAS比较与交换它是一种多线程同步的技术常用于实现无锁算法从而提高多线程程序的性能和扩展性。本篇文章具体讲解如何使用 CAS 的机制以及 CAS 机制带来的问题。 目录 1. 什么是CAS 2. CAS的应用 2.1 实现原子类 2.2 实现自旋锁 3. CAS的ABA问题 3.1 ABA问题可能引起的BUG 3.2 解决ABA问题 1. 什么是CAS CAS 全名 compare and swap 比较并交换是一种基于 Java 实现的 计算机代数系统用于多线程并发编程时数据在无锁的情况下保证线程安全安全运行。 CAS机制 主要用于对一个变量操作进行原子性的操作它包含三个参数值需要进行操作的变量A、变量的旧值B、即将要更改的新值C。 CAS机制 会对当前内存中的 A 进行判断看是否等同于 B 如果相等则把 A 值更改为 C 否则不进行操作。以下为 CAS 操作的一段伪代码 boolean CAS(A,B,C) {if (A B) {A C;return true;}return false;} 当然以上代码不具有原子性只是简单理解 CAS 的判定以及返回机制。真正的 CAS 只是一条 CPU 指令相比于上述代码具有原子性 。 在了解 CAS 的基本判定后下面我们来看如何通过 Java 标准库来运用 CAS 。 2. CAS的应用 2.1 实现原子类 CAS 可以不加锁保证操作的原子性Java 标准库提供了 Atomic 包装类相关的组合类来实现原子操作这些类都是在 java.util.concurrent.atomic 包底下的。 以常用的 AtomicInteger 类来举例AtomicInteger 类底下的 getAndIncrement 方法达到的效果就是自增类似于 i 操作getAndDecrement 方法就是自减类似于 i-- 操作。 因此 AtomicInteger 类常见的方法有 getAndIncrement 方法自增操作类似于 i。getAndDecrement 方法自减操作类似于 i--。get 方法获取当前 AtomicInteger 类引用的值。 当然Atomic 其他“数值”包装类也能使用以上方法 代码案例不使用 synchronized 的情况下保证一个线程自增5000另一个线程也自增5000最后返回两线程之和10000 public static void main(String[] args) throws InterruptedException {//初始化number为0AtomicInteger number new AtomicInteger(0);//线程1使number自增5000次Thread thread1 new Thread(()-{for (int i 0; i 5000; i) {number.getAndIncrement();}});//线程2也使number自增5000次在线程1执行后Thread thread2 new Thread(()-{for (int i 0; i 5000; i) {number.getAndIncrement();}});thread1.start();//启动线程1thread2.start();//启动线程2thread1.join();//等待线程1执行完毕thread2.join();//等下线程2执行完毕System.out.println(number.get());//输出number的值} 运行后打印 以上代码在不使用锁synchronized的情况下保证了线程的安全性。其底层运用的就是 CAS 机制getAndIncrement 方法的具体实现我们可以参考以下 伪代码 来理解 class MyAtomicInteger {private int value;public int getAndIncrement() {int oldValue value;while (CAS(value,oldValue,oldValue 1) ! true) {oldValue value;}return oldValue;} } 假设 getAndIncrement 方法被两个线程同时调用线程1 和 线程2 的 oldValue 值都为 0内存中的 value 值为0。 1线程1 进入了 getAndIncrement 方法此时线程1进行 CAS 判定发现线程1的 oldValue value就把 value 进行自增。 2 线程2 进入了 getAndIncrement 方法此时 线程2 进行 CAS 判定发现 oldValue ! value进入 while 循环把 value 赋值给 old Value。 3经过以上判断后线程2 再次进行 CAS 判断时发现 oldValue value 了此时的 value 值又会自增。 以上的 伪代码 就能实现一个原子类里面的 getAndIncrement 方法也是具备原子性的。通过上述图例就能很好的理解。 2.2 实现自旋锁 CAS的自旋锁指的是在使用CAS操作时当CAS操作失败后线程不直接阻塞等待而是继续尝试执行CAS操作即对前一次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;} } Thread.currentThread() 为当前对象的引用以上代码进行 CAS 判定时 如果判断 this.owner 为空则把当前对象的引用赋值给 this.owner。此时 CAS 方法返回 true并取反while 循环退出。判断 this.owner 不为空则不做任何操作CAS 方法返回 false并取反while 循环继续执行。由于 while 循环体内没有任何内容while 条件判断会执行很快直到 this.owner 加锁成功为止。 这就是自旋锁的体现关于锁的策略在本专栏中有详细讲解。大家可以前去查找。 3. CAS的ABA问题 ABA 问题是当线程1首先读取到共享变量值A。然后线程2先把这个共享变量值修改为B再修改回A。 此时其他线程再进行 CAS 操作时误以为共享变量值没有被修改过从而成功的将共享变量更改为新值。 但实际过程中共享变量经历了 由 A 变为 B再由 B 变为 A这样就可能会导致一些问题。 类似于网上购买一部二手机。买的时候卖家说是零件完好到手后才发现是一部翻新机。这样就会导致手机用不了几天就出问题。至于到手之前卖家不说是识别不出这部手机的好坏的。 3.1 ABA问题可能引起的BUG ABA 问题就是 CAS 机制导致的数据反复横跳。 假设张三要去 ATM 取钱张三余额有 1000 元他要取 500 元。他安排两个线程线程1 和 线程2 来并发执行取钱操作。 预期效果线程1 执行取钱操作判断余额为 1000执行余额 -500 操作此时余额 500线程2 处于阻塞等待状态。当 线程2 执行取钱操作判断余额不是 1000 不执行 -500 操作。 ABA问题出现线程 1 执行取钱操作判断余额为 1000执行余额 -500 操作此时余额 500线程2 阻塞等待状态。突然张三的朋友给他转账了 500 此时 余额又变回了 1000。 线程2 进入取钱操作时判断余额为 1000 元执行余额 -500 操作此时余额剩余 500。这就是 ABA 问题造成的后果张三回家后打开手机查看余额剩余 500实际张三被 ABA 问题坑了 500元。 3.2 解决ABA问题 CAS 操作是将需要改变的值 A 与旧值 B 进行比较相等则把新值 C 赋值给 A 否则不做改变。解决 CAS 出现 ABA 问题我们可以引入一个版本号比较版本号是否符合预期。 比如在网上购买一部二手机卖家会将手机的翻新程度进行一个版本号标记翻新1次记版本号1翻新2次的记版本号2以此类推。这时候客户会根据版本号来选择翻新程度相应的手机。 当版本号和读到的版本号相等则修改数据并把版本号 1。当版本号高于读到的版本号就操作失败认为数据已经被修改过了 根据以下 伪代码 来理解 num 0; version 1; old version; CAS(version,old,old1,num);public void CAS(version,oldVersion,oldVersion1,num){if(version oldVersion) {version oldVersion 1;num;} } 对以上代码进行一个讲解 version 作为版本号当 version 版本号等于读到的 oldVersion 版本号则把 oldVersion 1 赋值给 version并且 num 。这样就能避免 ABA 问题的出现。 当然Java 中 提供了一个 AtomicStampedReference类这个类可以对某个类进行保证这样就能提供上述的版本号管理功能。 public class TestDemo {private static final AtomicStampedReferenceInteger sharedValue new AtomicStampedReference(10, 0);public static void main(String[] args) throws InterruptedException {Thread thread1 new Thread(() - {int expectedStamp sharedValue.getStamp();int newValue 20;sharedValue.compareAndSet(10, newValue, expectedStamp, expectedStamp 1);System.out.println(Thread.currentThread().getName() updated sharedValue to newValue);}, Thread-1);Thread thread2 new Thread(() - {int expectedStamp sharedValue.getStamp();int oldValue sharedValue.getReference();int newValue 30;sharedValue.compareAndSet(oldValue, newValue, expectedStamp, expectedStamp 1);System.out.println(Thread.currentThread().getName() updated sharedValue to newValue);}, Thread-2);thread1.start();thread1.join();thread2.start();thread2.join();System.out.println(final value: sharedValue.getReference());} } 运行后打印 以上代码共享变量的初始值为10然后线程1将共享变量的值修改为20线程2将共享变量的值修改为30。由于AtomicStampedReference类包含版本号信息因此即使共享变量的值在这个过程中发生了ABA的变化CAS操作也可以正常进行不会出现误判现象。 谈谈你对 CAS 机制的理解 CAS 全称 compare and swap 即比较并交换它通过一个原子的操作完成“读取内存比较是否相等修改内存”这三个步骤本质上需要 CPU 指令的支持。 ABA 问题如何解决 我们可以给修改的数据加上一个版本号初始化当前版本号与旧的版本号相等。判断当前版本号如果等于旧版本号则对数据进行修改并使版本号自增。判断当前版本号大于旧版本号则不进行任何操作。 ‍作者一只爱打拳的程序猿Java领域新星创作者阿里云社区优质创作者、专家博主。 博客主页这是博主的主页  ️文章收录于Java多线程编程  ️JavaSE的学习JavaSE  ️Java数据结构:数据结构与算法  本篇博文到这里就结束了感谢点赞、收藏、评论、关注~
http://www.w-s-a.com/news/184128/

相关文章:

  • 网站如何做双链路示范学校建设专题网站
  • 网站开发北京影视网站seo描述
  • 高端网站定制建设公司哪家好企业网络推广技巧
  • 建设公司网站的内容建筑设计图片
  • 用ps怎么做网站的效果图互联网营销师报名入口官网
  • 网站的后端怎么开发网站 白名单
  • 济宁中小企业网站建设wordpress爆破工具
  • 零基础网站建设视频商城系统平台有哪些
  • 那个网站做百科好过wordpress删除
  • 优化网站排名怎么制作网站建设数据库模板
  • 哪个建站软件比较好带论坛都有什么公司需要网站建设
  • 同城便民网站开发自己免费怎么制作网站吗
  • 数据库网站开发教程网站内部优化是什么意思
  • 哈尔滨建站怎么做广西seo快速排名
  • 公司网站建设的不足企业文档管理wordpress
  • .net做的网站代码网站怎么加二级域名
  • 网站建设方案对比分析报告成都短视频代运营
  • 企业所得税税率知多少重庆seo什么意思
  • ftp如何修改网站备案号百度云建站
  • 免费做网站空间dede二手车网站源码
  • 网站服务器需要多大设计网站公司开发
  • asp 网站权限设计做网站业务员
  • 做棋牌网站违法嘛网络服务网络推广
  • 专门做推广的网站吗免费建域名网站
  • 在百度做网站株洲网站平台搭建
  • 用node做的网站南宁网站定制开发
  • 做刷单网站犯法吗wordpress depth
  • 潍坊青州网站建设少儿编程app
  • 表白网站制作源代码自己怎么免费做网站网页
  • 开源网站建设是什么工作个人虚拟网站