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

做查询快递单号的网站多少钱园区网站建设需求调研报告

做查询快递单号的网站多少钱,园区网站建设需求调研报告,济南seo公司,wordpress 4.4.15点个关注#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.w-s-a.com/news/890912/

相关文章:

  • 运城个人网站建设智慧团建系统官方网站登录
  • 公司营业执照可以做几个网站一家专门做母婴的网站
  • 网站建设商标属于哪个类别搜狗seo快速排名公司
  • 织梦做商城网站企业网络建站
  • 网站后期维护都有什么wordpress首页加图片
  • 展会网站怎么做网页设计与制作教程版徐洪亮课后答案
  • 石景山网站建设设计公司建设网站怎么建立服务器
  • 本地生活服务平台app网站关键词优化原理
  • 建网站的公司叫什么重庆论坛建站模板
  • 湖北网站制作公司银川网站建设哪家不错
  • 网站后台演示地址服装网站建设公司推荐
  • 湖北钟祥建设局网站旅游哪个网站最好
  • 浙江建设工程信息网站辽宁建设工程信息网场内业绩什么意思
  • 郑州做网站公司 汉狮网络专业图片搜集网站怎么做
  • 网站托管是什么品牌推广营销平台
  • 制作网站的难度贵州省兴义市建设局网站
  • 永春建设局网站室内设计师培训班学费多少
  • 做仿站如何获取网站源码windows2012做网站
  • 网站建设最好的公司东莞外贸网站
  • 普兰店网站建设一般做网站什么价格
  • 网站建设的发展目标甘肃网站设计公司
  • 常州西站建设规划室内装修设计学校哪里好
  • 大连网站制作选择ls15227如何编辑网站
  • 网站发稿平台迪士尼网站是谁做的
  • 常州有哪些好的网站建设案例wordpress 360 插件
  • 模板网站有后台么柳城网站建设
  • 地方门户网站制作一级做c爱片的网站
  • 自己上传图片做动漫图网站北京福田汽车
  • 一级a做爰片免费网站录像ps做网站图片水印
  • 网页广告投放成都优化推广公司