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

怎样做微网站商城开发价格

怎样做微网站,商城开发价格,拘束 wordpress,平面设计网上培训机构文章目录 什么是 CASCAS 的应用如何使用 CAS 操作实现自旋锁CAS 的 ABA 问题CAS 相关面试题 什么是 CAS CAS#xff08;Compare and Swap#xff09;是一种原子操作#xff0c;用于在无锁情况下保证数据一致性的问题。它包含三个操作数——内存位置、预期原值及更新值。在执… 文章目录 什么是 CASCAS 的应用如何使用 CAS 操作实现自旋锁CAS 的 ABA 问题CAS 相关面试题 什么是 CAS CASCompare and Swap是一种原子操作用于在无锁情况下保证数据一致性的问题。它包含三个操作数——内存位置、预期原值及更新值。在执行CAS操作时会将内存位置的值与预期原值进行比较。如果两者相等则处理器会自动将该位置的值更新为新值如果不相等则处理器不做任何操作。这个过程是原子的即在整个操作期间不会被其他线程或进程中断。 在多线程并发编程中CAS操作可以避免传统的锁机制引起的线程阻塞和上下文切换等问题提高程序的并发性能。 CAS伪代码 boolean CAS(address, expectValue, swapValue) {//如果内存address中的值和expectValue相等话//就将swapValue的值赋给adress并且返回trueif (address expectValue) {address swapValue;return true;}return false; }CAS 是一个 CPU 指令具有原子性而具有原子性的操作就代表着不需要加锁就可以保证线程的安全所以 CAS 操作就可以替代某些加锁的操作。 CAS 本质上是 CPU 提供的指令然后被操作系统封装形成 API 后又被 JVM 或者其它封装成为 API 之后我们程序员才可以直接使用 CAS 的相关操作。 CAS 的应用 CAS 经过 CPU 和 JVM 封装之后我们在 Java 代码中就可以直接使用 CAS 操作那么我们来看看在 Java 中如何使用 CAS 操作。 标准库中提供了 java.util.concurrent.atomic 包, 里面的类都是基于这种方式来实现的. 我们可以根据需要创建出合适的类如果你要进行 CAS 的数据类型为 int 类型的话就创建 AtomicInteger 类如果是 boolean 类型的话就创建出 AtomicBoolean 类型。 AtomicInteger 类中有很多方法但是我们今天主要了解 getAndDecrement 方法和 getAndIncrement 方法它们分别表示–和操作。 public class Test {public static void main(String[] args) throws InterruptedException {AtomicInteger atomicInteger new AtomicInteger(0);Thread t1 new Thread(() - {for(int i 0; i 1000; i) {atomicInteger.getAndIncrement();}});Thread t2 new Thread(() - {for(int i 0; i 1000; i) {atomicInteger.getAndIncrement();}});t1.start();t2.start();t1.join();t2.join();System.out.println(atomicInteger.get()); //2000} }public class Test {public static void main(String[] args) throws InterruptedException {AtomicInteger atomicInteger new AtomicInteger(10000);Thread t1 new Thread(() - {for(int i 0; i 1000; i) {atomicInteger.getAndDecrement();}});Thread t2 new Thread(() - {for(int i 0; i 1000; i) {atomicInteger.getAndDecrement();}});t1.start();t2.start();t1.join();t2.join();System.out.println(atomicInteger.get()); //8000} }或者–的操作不具有原子性如果在多线程中进行或者–操作的时候往往会发生线程不安全问题导致最终的结果不是我们想要的结果而这里我们使用 CAS 操作的话就保证了和–操作的原子性并且也避免了加锁阻塞的现象既保证了答案的正确性又保证了运行速度。 查看 getAndIncrement 方法我们可以看到这个方法里面又调用了 getAndAddInt 方法但是这个方法是属于 unsafe 的unsafe 中的方法都是偏底层且操作较危险的操作。 可以看到 getAndAddInt 方法中是没有加锁操作的。 compareAndSwapInt 方法是 native 修饰的本地方法这个方法是 JVM 底层由 C/C 写的我们是看不到的。 这里 getAndIncremnet 方法还是用伪代码来实现一遍。 class AtomicInteger {private int value;public int getAndIncrement() {//这里现在寄存器当中存储value的值int oldValue value;//比较内存中的value值是否和寄存器当中的oldValue相同//如果相同则说明该过程中value的值没有被修改然后将后面的修改值赋给value//如果不相同说明在这个过程中value的值被修改了那么更新oldValue的值while (CAS(value, oldValue, oldValue 1) ! true)oldValue value;}return oldValue;} }如何使用 CAS 操作实现自旋锁 前面【JavaEE】锁策略中为大家讲解了什么是自旋锁自旋锁就是当线程想要获取到锁但是这个锁正别其他线程使用的时候一般请情况下线程会进入阻塞等待状态但是自旋锁不是它不释放 CPU 资源反复确认这个锁是否被释放使得整个操作一直处于用户态操作减少了内核态操作而增加一些其他操作。接下来我们就来使用 CAS 操作来实现自旋锁。 public class SpinLock {//owner表示当前锁是被哪个线程所拥有当owner为null的时候表示该所可以被获取private Thread owner null;//while判断当前owner时候为null如果是则获取到整个锁修改owner为当前线程//如果owner不为null则表示锁被其他线程使用那么就会返回falsewhile里面的//判断就为true进入死循环直到其他线程使用unlock方法释放锁public void lock() {while (!CAS(this.owner, null, Thread.currentThread())) {}}public void unlock() {this.owner null;} }通过 CAS 操作就解决了当多个线程竞争一个锁的时候线程进入阻塞等待状态由用户态操作转为内核态的情况保证了程序处于用户态的操作状态。 CAS 的 ABA 问题 CAS 操作是判断内存中的数据是否和寄存器中的值相等那么是否会发生一种情况就是在这个过程中内存中的数据由 A - B - A也就是说内存中的数据被修改了一次但是最后又被改回来了的情况呢当然是可能的那么如果发生这种情况的时候是否会出现问题呢 使用 CAS 操作的时候如果发生 ABA 的问题时一般不会出现问题但是有些特殊的情况会造成问题。比如我现在是大学生每个月我的父母就会向我的银行卡里面打钱我呢手机绑定了银行卡就需要从银行卡中将这些钱充值到微信或者支付宝上我打算充值1000块但是当我点击充值按钮的时候因为网卡我点了一次没反应所以我又点了一次当网络好了的时候它后台就显示我点击了两次但是实际上我只想充值一次那么微信或者支付宝的后台就会有两个线程执行 CAS 操作。 但是如果在这个时候我的父母又给我银行卡里面打了1000块钱的时候会发生什么呢 那么如何解决 CAS 的 ABA 问题呢造成 ABA 的问题就是变量既有增加也有减少如果我们使用的变量是只增或者只减的话那么就不会发生这种 ABA 问题。我们可以引入一个额外的变量版本号换个版本号是只增的修改一次余额就增加版本号一次当执行 CAS 操作的时候会判断内存中的版本号和寄存器当中的版本号是否相同相同则可以执行不相同就说明中间穿插了其他的修改操作不执行修改操作。 public class Test2 {private int value;//number表示版本号private int number 0;public void add(int money) {int oldNumber number;//进行一次修改操作之后版本号就加1if (CAS(number, oldNumber, oldNumber 1)) {value money;}} }CAS 相关面试题 1) 讲解下你自己理解的 CAS 机制 全称 Compare and swap, 即 “比较并交换”. 相当于通过一个原子的操作, 同时完成 “读取内存, 比较是否相等, 修改内存” 这三个步骤. 本质上需要 CPU 指令的支撑 2) ABA问题怎么解决 给要修改的数据引入版本号. 在 CAS 比较数据当前值和旧值的同时, 也要比较版本号是否符合预期.如果发现当前版本号和之前读到的版本号一致, 就真正执行修改操作, 并让版本号自增; 如果发现当前版本号比之前读到的版本号大, 就认为操作失败
http://www.hkea.cn/news/14465236/

相关文章:

  • 东莞网站制作支付通道高端网约车有哪些平台
  • 石家庄免费网站设计二手交易网站设计怎么做
  • 泸州做网站企业地址如何地图添加
  • 做网站主页用html做网站的背景图怎么弄
  • 中国人在国外做网站网站代理网站建设工程师是做什么的
  • 关于网站制作的评价谷歌网站入口
  • 选择常州网站建设公司wordpress手动获取相关文章
  • 自由设计师网站招标网站建设申请
  • 公司网站建设哪家正规python18+21
  • ftp 企业网站网站如何转做app
  • 网站开发有什么工作内容热点新闻事件素材
  • 上海网站商城建设网站建设费计什么科目
  • 自己做电影网站需要的成本阿里云虚拟主机wordpress建站
  • 鄂州网站建设企业推广三合一做网站
  • 对重庆电子政务网站建设评价什么是可信网站认证
  • 网站开发项目名长沙有实力seo优化公司
  • 网站添加锚点店面设计费
  • 网站推广的技巧live writer wordpress
  • 长沙市做网站公司排名内衣网站建设推广
  • 网站怎么做页面解析跳转企业管理咨询服务合同范本
  • 如何做百度推广网站广州哪里有做公司网站 什么价
  • 杭州网站建设公司官网云服务器和云虚拟主机
  • 大连网站建设微信群html制作旅游景点网页
  • 设计的网站有哪些个人相册网站模板
  • 企业在阿里云做网站wordpress 批量审核
  • 用php做的博客网站家教网站建设的推广
  • 济南哪有做网站的上海高档网站建设
  • 个人网站如何提高访问量linux怎么下载wordpress
  • 企业官网响应式网站网站发布工具
  • 提供网站建设电话物流公司在哪里找