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

丽水网站建设农业网站建设方案 ppt模板

丽水网站建设,农业网站建设方案 ppt模板,营销目标分为三个方面,wordpress建立栏目点个关注#xff0c;必回关 文章目录CAS原理剖析1、参数解密CAS底层指令CAS#xff08;Compare and swap#xff09;是一种用于在多线程环境下实现同步功能的机制CAS原理剖析 CAS 被认为是一种乐观锁#xff0c;有乐观锁#xff0c;相对应的是悲观锁。 在上述示例中必回关 文章目录CAS原理剖析1、参数解密CAS底层指令CASCompare and swap是一种用于在多线程环境下实现同步功能的机制CAS原理剖析 CAS 被认为是一种乐观锁有乐观锁相对应的是悲观锁。 在上述示例中我们使用了 synchronized如果在线程竞争压力大的情况下synchronized 内部会升级为重量级锁此时仅能有一个线程进入代码块执行如果这把锁始终不能释放其他线程会一直阻塞等待下去。此时可以认为是悲观锁。 悲观锁会因线程一直阻塞导致系统上下文切换系统的性能开销大。 那么我们可以用乐观锁来解决所谓的乐观锁其实就是一种思想。 乐观锁会以一种更加乐观的态度对待事情认为自己可以操作成功。当多个线程操作同一个共享资源时仅能有一个线程同一时间获得锁成功在乐观锁中其他线程发现自己无法成功获得锁并不会像悲观锁那样阻塞线程而是直接返回可以去选择再次重试获得锁也可以直接退出。 CAS 正是乐观锁的核心算法实现。 在示例代码的方案中都提到了 AtomicInteger、LongAdder、Lock锁底层此外当然还包括 java.util.concurrent.atomic 并发包下的所有原子类都是基于 CAS 来实现的。 以 AtomicInteger 原子整型类为例一起来分析下 CAS 底层实现机制。 atomicData.incrementAndGet()源码如下所示 // 提供自增易用的方法返回增加1后的值 public final int incrementAndGet() {return unsafe.getAndAddInt(this, valueOffset, 1) 1; }// 额外提供的compareAndSet方法 public final boolean compareAndSet(int expect, int update) {return unsafe.compareAndSwapInt(this, valueOffset, expect, update); }// Unsafe 类的提供的方法 public final int getAndAddInt (Object o,long offset, int delta){int v;do {v getIntVolatile(o, offset);} while (!weakCompareAndSetInt(o, offset, v, v delta));return v; }我们看到了 AtomicInteger 内部方法都是基于 Unsafe 类实现的Unsafe 类是个更底层硬件CPU指令通讯的复制工具类。 1、参数 由这段代码看到 unsafe.compareAndSwapInt(this, valueOffset, expect, update)所谓的 CAS其实是个简称全称是 Compare And Swap对比之后交换数据。 上面的方法有几个重要的参数 1thisUnsafe 对象本身需要通过这个类来获取 value 的内存偏移地址。 2valueOffsetvalue 变量的内存偏移地址。 3expect期望更新的值。 4update要更新的最新值。 如果原子变量中的 value 值等于 expect则使用 update 值更新该值并返回 true否则返回 false。 再看如何获得 valueOffset的 // Unsafe实例 private static final Unsafe unsafe Unsafe.getUnsafe(); private static final long valueOffset;static {try {// 获得value在AtomicInteger中的偏移量valueOffset unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField(value));} catch (Exception ex) { throw new Error(ex); } } // 实际变量的值 private volatile int value;这里看到了 value 实际的变量是由 volatile 关键字修饰的为了保证在多线程下的内存可见性。 为何能通过 Unsafe.getUnsafe() 方法能获得 Unsafe 类的实例其实因为 AtomicInteger 类也在 **rt.jar **包下面的所以 AtomicInteger 类就是通过 Bootstrap 根类加载器进行加载的。 源码如下所示 CallerSensitive public static Unsafe getUnsafe() {Class var0 Reflection.getCallerClass();// Bootstrap 类加载器是C的正常返回null否则就抛异常。if (!VM.isSystemDomainLoader(var0.getClassLoader())) {throw new SecurityException(Unsafe);} else {return theUnsafe;} }解密CAS底层指令 其实掌握以上内容对于 CAS 机制的理解相对来说算是比较清楚了。 当然如果感兴趣也可以继续深入学习用到了哪些硬件 CPU 指令。 底层硬件通过将 CAS 里的多个操作在硬件层面语义实现上通过一条处理器指令保证了原子性操作。这些指令如下所示 1测试并设置Tetst-and-Set 2获取并增加Fetch-and-Increment 3交换Swap 4比较并交换Compare-and-Swap 5加载链接/条件存储Load-Linked/Store-Conditional 前面三条大部分处理器已经实现后面的两条是现代处理器当中新增加的。而且根据不同的体系结构指令存在着明显差异。 在IA64x86 指令集中有 cmpxchg 指令完成 CAS 功能在 sparc-TSO 也有 casa 指令实现而在 ARM 和 PowerPC 架构下则需要使用一对 ldrex/strex 指令来完成 LL/SC 的功能。在精简指令集的体系架构中则通常是靠一对儿指令如load and reserve 和 **store conditional ** 实现的在大多数处理器上 CAS 都是个非常轻量级的操作这也是其优势所在。 sun.misc.Unsafe 中 CAS 的核心方法 public final native boolean compareAndSwapObject(Object var1, long var2, Object var4, Object var5);public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);public final native boolean compareAndSwapLong(Object var1, long var2, long var4, long var6);这三个方法可以对应去查看 openjdk 的 hotspot 源码 #define FN_PTR(f) CAST_FROM_FN_PTR(void*, f){CCcompareAndSwapObject, CC(OBJJOBJOBJ)Z, FN_PTR(Unsafe_CompareAndSwapObject)},{CCcompareAndSwapInt, CC(OBJJII)Z, FN_PTR(Unsafe_CompareAndSwapInt)},{CCcompareAndSwapLong, CC(OBJJJJ)Z, FN_PTR(Unsafe_CompareAndSwapLong)},cmpxchg 函数源码 jbyte Atomic::cmpxchg(jbyte exchange_value, volatile jbyte*dest, jbyte compare_value) {assert (sizeof(jbyte) 1,assumption.);uintptr_t dest_addr (uintptr_t) dest;uintptr_t offset dest_addr % sizeof(jint);volatile jint*dest_int ( volatile jint*)(dest_addr - offset);// 对象当前值jint cur *dest_int;// 当前值cur的地址jbyte * cur_as_bytes (jbyte *) ( cur);// new_val地址jint new_val cur;jbyte * new_val_as_bytes (jbyte *) ( new_val);// new_val存exchange_value后面修改则直接从new_val中取值new_val_as_bytes[offset] exchange_value;// 比较当前值与期望值如果相同则更新不同则直接返回while (cur_as_bytes[offset] compare_value) {// 调用汇编指令cmpxchg执行CAS操作期望值为cur更新值为new_valjint res cmpxchg(new_val, dest_int, cur);if (res cur) break;cur res;new_val cur;new_val_as_bytes[offset] exchange_value;}// 返回当前值return cur_as_bytes[offset]; }源码中具体变量添加了注释因为都是 C 代码所以作为了解即可 ~ jint res cmpxchg(new_val, dest_int, cur);
http://www.tj-hxxt.cn/news/229017.html

相关文章:

  • 古典 网站 模板国产搜什么关键词最好看
  • 中国美院网站建设公司wordpress 搜索引索
  • 什么在56网站做推广宝塔做网站安全吗
  • 中国建设人才网信息网站网站打赏怎么做的
  • 建设网站虚拟主机是啥意思网站开发的几个步骤
  • 网站建设费用自建男生和男生男生做的漫画网站
  • 做平面免费接单网站做促销的网站
  • 大气宽屏企业网站源码苏州归巢网络科技有限公司
  • 网门网站下载地址网站建设专业知识应用
  • 常州建设局官方网站制作小程序公司
  • 南京做网站营销科技的意义和价值
  • 保定专业网站建设开发公司做网站建设的好处
  • 潍坊哪家网站制作公司好包头市网站建设
  • 黔西南北京网站建设谷歌关键词查询工具
  • 房产网站栏目建设企业网站cms源码
  • 公司为什么要网站备案yw55523can优物入口4虎
  • 网站后台帐号房地产网站设计方案
  • 海外建站平台重庆网站开发商城
  • 关于网站得精神文明建设上海高端网站建设公司哪家好
  • 建站神器跟wordpress哪个好企业移动网站制作
  • 网站logo怎么替换个人网站制作的主要内容
  • 专门做婚纱儿童摄影网站免费推广产品的平台
  • 公司网站域名实名认证怎么做网站版面设计
  • vs做网站的书籍网站建设注意哪些问题
  • wap网站微信一键登录河北seo网站优化电话
  • 阿里云 有企业 网站吗dw做的网站怎么
  • 建设官方网站意义如何用织梦建网站
  • 网站经营网络备案信息网站开发需求分析参考文献
  • 网站页面效果图怎么做的wordpress 会员管理
  • 合肥市建设通网站宝安自适应网站建设