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

成都网站建设制作怎样做网络推广营销

成都网站建设制作,怎样做网络推广营销,51素材网,政府网站建设汇报及时更新点个关注,必回关 文章目录CAS原理剖析1、参数解密CAS底层指令CAS(Compare and swap)是一种用于在多线程环境下实现同步功能的机制CAS原理剖析 CAS 被认为是一种乐观锁,有乐观锁,相对应的是悲观锁。 在上述示例中&…

点个关注,必回关

文章目录

  • CAS原理剖析
    • 1、参数
  • 解密CAS底层指令

CAS(Compare 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,对比之后交换数据。
上面的方法,有几个重要的参数:

(1)this,Unsafe 对象本身,需要通过这个类来获取 value 的内存偏移地址。

(2)valueOffset,value 变量的内存偏移地址。

(3)expect,期望更新的值。

(4)update,要更新的最新值。

如果原子变量中的 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)

前面三条大部分处理器已经实现,后面的两条是现代处理器当中新增加的。而且根据不同的体系结构,指令存在着明显差异。

在IA64,x86 指令集中有 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){CC"compareAndSwapObject", CC"("OBJ"J"OBJ""OBJ")Z",  FN_PTR(Unsafe_CompareAndSwapObject)},{CC"compareAndSwapInt",  CC"("OBJ"J""I""I"")Z",      FN_PTR(Unsafe_CompareAndSwapInt)},{CC"compareAndSwapLong", CC"("OBJ"J""J""J"")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.fp688.cn/news/156054.html

相关文章:

  • 网站编辑做图片用什么什么建站程序最利于seo
  • 做公司网站联系公司免费创建网站的平台
  • 用什么软件制作图片太原seo代理商
  • 怎么修改网站网页的背景图片网络项目发布网
  • sql数据库做的网站怎么发布百度搜索资源平台token
  • 简述网络营销的特点是什么湖南长沙seo
  • discuz做资讯网站自媒体135网站
  • 最权威的做网站设计哪家好网络营销师官网
  • wordpress模板双响徐州seo
  • 北京公司网站建设推荐交易链接大全
  • 网页设计中用div做网站例子今日热点
  • 网站设计用的技术关键词排名公司
  • 大连建设网站便民服务互联网营销师证书有用吗
  • 建站公司专业定制中国十大广告公司排行榜
  • 义乌系统开发青岛seo服务哪家好
  • 前端学习网站百度seo优化推广
  • 网站的联系我们怎么做企业宣传软文范例
  • 做的网站怎么放在网上seo公司后付费
  • 1个ip可以做几个网站吗南京seo外包
  • 网站建设百度搜索到左边的图seo的基础是什么
  • 网站可以自己做吗小程序开发平台有哪些
  • 酒店网络设计方案seo外包品牌
  • 京东网站设计特点深圳谷歌seo公司
  • 动态网站开发从入门到实践外包网络推广公司推广网站
  • 软件研发和开发的区别seo关键词排名优化的方法
  • 洛宁网站建设湖南省人民政府
  • ps模板网站推荐厦门百度快速优化排名
  • 新疆伊犁河建设管理局网站百度seo快速排名
  • 自己网站做反链常州百度推广代理
  • 织梦网站联系我们的地图怎么做网络推广和网络营销的区别