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

安徽振兴集团网站开发做网站招聘的职业顾问

安徽振兴集团网站开发,做网站招聘的职业顾问,织梦做英文网站,影视文化网站建设SueWakeup 个人主页#xff1a;SueWakeup 系列专栏#xff1a;学习Java 个性签名#xff1a;人生乏味啊#xff0c;我欲令之光怪陆离 本文封面由 凯楠#x1f4f7; 友情赞助! 目录 前言 悲观锁和乐观锁 什么是 CAS ? 什么是原子操作#xff1f; CAS 执行流… SueWakeup 个人主页SueWakeup 系列专栏学习Java 个性签名人生乏味啊我欲令之光怪陆离  本文封面由 凯楠 友情赞助! 目录 前言 悲观锁和乐观锁 什么是 CAS ? 什么是原子操作         CAS 执行流程  Java 中的原子操作类(基于 CAS 的 AtomicInteger) Unsafe  Unsafe 实现 CAS 的工作原理 CAS 的缺点 注手机端浏览本文章可能会出现 “目录”无法有效展示的情况请谅解点击侧栏目录进行跳转     前言 在高并发的业务场景下线程安全可以通过 synchronized 或 Lock 来保证同步从而达到线程安全的目的。但是 synchronized 或 Lock 都是基于互斥锁的思想实现加锁和释放锁的过程中都会带来性能损耗问题。 除了 synchronized 或 Lock 以外还可以通过 JUCjava.util.concurrent.xxx提供的 CAS 机制实现无锁的解决方案它是基于乐观锁的思想方案实现非阻塞的同步方式从而保证线程安全。 悲观锁和乐观锁 悲观锁 在持有数据的时候将 资源 或 数据 加锁认为数据很可能会被其他人所修改线程冲突适用于写多读少的场景避免频繁失败和重试影响性能乐观锁 程序不加锁认为资源和数据不会被别人所修改线程冲突但在进行写入操作的时候会判断当前数据是否被修改过一旦有冲突发生通常采用一种称为 CAS 的技术保证线程执行的安全性适用于读多写少的场景避免加锁影响性能 什么是 CAS ? CAS 全称 “比较并交换”Compare And Swap。是一种原子操作现代 CPU 广泛支持的一种对内存中的共享数据进行操作的特殊指令。进行读写操作时 CPU 会比较内存中某个值是否和预期的值相同如果相同则将这个值更新为新值不相同则不做更新无锁的线程同步解决方案基于 “乐观锁” 思想的操作保证多线程并发中保障共享资源的原子操作相对于 synchronized 或 Lock 来说是一种轻量级的实现方案使用案例 Java 的核心类库中 AtomicInteger、ConcurrentHashMap 都是基于 CAS 机制实现原子操作Java 中的 CAS 机制是通过 Unsafe 类提供的 compareAndSwapXXX() 等 CAS 方法实现底层通过 CPU 指令 cmpxchg 实现 什么是原子操作         原子操作是指不能被线程调度打断的操作。通常是一系列操作该系列操作从执行开始到执行结束期间不会发生线程切换原子操作不能被中断。 CAS 执行流程  假设内存中存在一个变量 i它在内存中对应的值是 A第一次读取 此时经过业务计算处理后结算结果为新值 B在更新之前会再去读 i 现在的值 C。如果 A 和 C 相同代表业务计算处理的过程中 i 的值并没有发生变化才会把 i 更新交换为新值 B。如果不相同那说明在业务计算时i 的值发生了变化则不进行更新操作。最后 CPU 会将旧的数值返回。 总结要更新的值是否等于旧值如果等于将该值设置为新值如果不等于将旧数值返回 Java 中的原子操作类(基于 CAS 的 AtomicInteger) Java 无法控制线程的切换所以 Java 中 CAS 操作采用 native 方法底层采用 C  或 C 实现 AtomicInteger 是 java.util.concurrent.atomic 包下的一个子类该包下还有 AtomicBoolean ,AtomicLong,AtomicLongArray,AtomicReference 等原子类主要用于在高并发环境下保证线程安全。 AtomicInteger 常用方法 // AtomicInteger 常用方法public final int get(); // 获取当前值 public final int getAndSet(int newValue); // 获取当前的值并设置新的值 public final int getAndIncrement(); // 获取当前的值并自增 1 public final int getAndDecrement(); // 获取当前的值并自减 1 public final int getAndAdd(int delta); // 获取当前的值并自增指定值 AtomicInteger 核心源码  public class AtomicInteger extends Number implements java.io.Serializable {//底层访问对象private static final Unsafe unsafe Unsafe.getUnsafe();private static final long valueOffset;static {try {//基于 Unsafe 对象获取 value 字段相对当前对象的“起始地址”的偏移量valueOffset unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField(value));} catch (Exception ex) { throw new Error(ex); }}private volatile int value;// 获取当前的值public AtomicInteger(int initialValue) {value initialValue;}/* 获取当前的值并自增 1* 1.this:当前的实例* 2.valueOffset:value实例变量的偏移量* 3.delta:自增 1*/public final int getAndIncrement() {return unsafe.getAndAddInt(this, valueOffset, 1);}/* 获取当前的值并自增指定值* 1.this:当前的实例* 2.valueOffset:value实例变量的偏移量* 3.delta:自增指定值*/public final int getAndAdd(int delta) {return unsafe.getAndAddInt(this, valueOffset, delta);}} Unsafe  在 AtomicInteger 核心源码中可以看到 CAS 机制是通过 Unsafe 类实现。 sum.misc.Unsafe 是 JDK 提供的一个底层工具类。它提供内存操作、CAS、对象操作等 “不安全” 的功能来让 JDK 能够使用 Java 代码来实现原本需要使用 native 本地方法才可以实现的功能。由于该类不应该在 JDK 核心类库之外使用所以被命名为 Unsafe不安全 Unsafe 实现 CAS 的工作原理 AtomicInteger 类 public final int incrementAndGet() {return unsafe.getAndAddInt(this, valueOffset, 1) 1;} Unsafe 类 public final int getAndAddInt(Object var1, long var2, int var4) {int var5;do {var5 this.getIntVolatile(var1, var2);} while(!this.compareAndSwapInt(var1, var2, var5, var5 var4));return var5;} 首先读取当前对象 var1 在主内存中的值并保存到 var5 中然后通过循环判断当前对象在主内存中的值是否等于 var5如果相同就自增交换 var5 与 var5  var4 两个值否则继续循环重新获取 var 值。         在上述逻辑中核心方法是 compareAndSwapInt()方法它是一个 native 方法这个方法编译后的 CPU 指令是 cmpxchg该指令连续执行不会被打断所以可以保证原子性。         在 getAndAddInt()方法中通过 do...while 循环操作实现自旋锁当预期值和主内存中的值不等时就重新获取主内存中的值。 CAS 的缺点 循环时间长开销大 在 Unsafe 的实现中使用了自旋锁的机制。在该环境如果 CAS 操作失败就需要循环进行 CAS 操作do...while 循环同时读取最新的期望值如果长时间都不成功的话那么会造成 CPU 极大的开销只能保证一个共享变量的原子操作 在最初的实例中可以看出是针对一个共享变量使用了 CAS 机制可以保证原子性操作。但如果存在多个共享变量或一整个代码块的逻辑需要保证线程安全CAS 就无法保证原子性操作此时需要考虑采用加锁方式悲观锁保证原子性ABA 问题 线程 P1 在共享变量中读到值 A线程 P1 被抢占线程 P2 开始执行线程 P2 把共享变量里的值从 A 改成了 B再改回到 A线程 P2 被抢占线程 P1 开始执行线程 P1 回来看到共享变量里的值没有被改变继续执行 可以通过 JDK 的 Atomic 包中的 AtomicStampedReference 类来解决 ABA问题使用 compareAndSet 方法的作用是首先检查当前引用是否等于预期引用并且检查当前标志是否等于预期标志如果全部相等则以原子方式将该引用和该标志的值设置为给定的更新值。
http://www.dnsts.com.cn/news/226946.html

相关文章:

  • 网站没有地图怎么做网站开发地址
  • 网站建设是不是要有营业执照深圳企业年报网上申报入口
  • 聊城手机网站建设多少钱北京企业网站模板建站开发
  • 30岁女人学网站开发可以吗wordpress 媒体路径
  • 江西建设厅网站官网爱客影院wordpress
  • 地方志网站建设自查报告网站搜索引擎优化技术
  • 网站推广优化如何做口红做网站多少钱
  • 网站建设的阶段html5网站布局教程
  • 建设银行网站可以查询存折吗电子商务的网站怎么做
  • 网站没有收录了免费网站加速器
  • iis7 建立网站音乐展示网站建设平台
  • 怎么做网站访问截取ip建设银行360网站登录不了
  • 科汛kesioncms网站系统北京比较大的网站建设公司
  • 中性衣服印花图案设计网站济南做外贸网站
  • 招聘网站怎么做介绍wordpress怎么更改后台路径
  • 建设软件资源网站wordpress门户cms
  • 想自己搭建网站得怎么做私域平台运营分为几个步骤
  • 网站设计制作都有哪些淘宝运营培训视频教程
  • 国内人做韩国网站一般都卖什么东西wordpress文章放视频
  • 建网站手机版招聘软件开发工程师
  • 网站的手机站页面重复深圳互联网公司
  • 南阳做网站多少费用男女一起做暖暖网站
  • 问题反馈的网站怎么做学网站开发推荐书
  • 小型购物网站做网站前台和后台是什么
  • 福州免费做网站和wordpress类似的开源博客
  • 找人做方案的网站新乡网站的建设
  • 网站建设公司工资设置免费网站优化怎么做
  • 有做思维图的网站吗wordpress静态网址
  • 贵阳网站建设方案报价普通话
  • 泰国金木棉做网站网站公司发布网站需要备案