摘要:调用获取字段在对象中的偏移量其实就是一个字段到对象头部的偏移量,通过这个偏移量可以快速定位字段定义为类型,保证在多线程中的可见性调用参数为当前对象,偏移量,操作值最后是由于获取的值为交换前的值通过返回循环获取最新内存值方法包含两个参数
unsafe.objectFieldOffset
调用unsafe.objectFieldOffset获取value字段在对象中的偏移量(其实就是一个字段到对象头部的偏移量,通过这个偏移量可以快速定位字段)
static { try { valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value")); } catch (Exception ex) { throw new Error(ex); } }
定义value为volatile类型,保证value在多线程中的可见性
private volatile int value;decrementAndGet
调用unsafe.getAndAddInt,参数为当前对象,偏移量,操作值
/** * Atomically decrements by one the current value. * * @return the updated value */ public final int decrementAndGet() { //最后-1是由于getAndAddInt获取的值为交换前的值 return unsafe.getAndAddInt(this, valueOffset, -1) - 1; }
getAndAddInt
通过compareAndSwapInt返回循环getIntVolatile获取最新内存值
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; }
getIntVolatile
方法包含两个参数,当前对象,偏移量;获取内存地址指向的整数,并支持volatile语义
public native int getIntVolatile(Object var1, long var2);
compareAndSwapInt
方法包含了四个参数,当前对象,偏移量,期望值,新值;如果当前对象对应偏移量的值与期望值相同,则把当前对象的值更改为新值,并返回true;否则返回false
public final native boolean compareAndSwapInt(Object var1, long var2, int var4, int var5);
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73340.html
摘要:提供这些原子类的目的就是为了解决基本类型操作的非原子性导致在多线程并发情况下引发的问题。测试代码引发的线程问题最终的值为如果是原子操作,那么结果应该就是,反复运行几次发现结果大部分情况下都不是,这也证明了的非原子性在多线程下产生的问题。 AtomicInteger的原理 java的并发原子包里面提供了很多可以进行原子操作的类,比如: AtomicInteger AtomicBoole...
原子变量 java.util.concurrent.atomic包定义了支持单个变量的原子操作的类,所有类都有get和set方法,类似于对volatile变量的读写操作,也就是说,set与在同一个变量上任何后续的get具有先发生关系,compareAndSet原子方法也具有这些内存一致性特性,适用于整数原子变量的简单原子算法也是如此。 要查看如何使用此包,让我们返回我们最初用于演示线程干扰的Cou...
摘要:池化技术简介在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵的,而池化技术则预先创建了资源,这些资源是可复用的这样就保证了在多用户情况下只能使用指定数目的资 池化技术简介 在我们使用数据库的过程中,我们往往使用数据库连接池而不是直接使用数据库连接进行操作,这是因为每一个数据库连接的创建和销毁的代价是昂贵...
摘要:顾名思义,是类型的线程安全原子类,可以在应用程序中以原子的方式更新值。创建对象先来看下对象的创建。也就是说当一个线程修改一个共享变量时,其它线程能立即读到这个修改的值。 showImg(https://segmentfault.com/img/remote/1460000016012210); 本文首发于一世流云的专栏:https://segmentfault.com/blog... ...
阅读 1970·2021-11-12 10:36
阅读 1813·2021-11-09 09:49
阅读 2565·2021-11-04 16:12
阅读 1119·2021-10-09 09:57
阅读 3207·2019-08-29 17:24
阅读 1883·2019-08-29 15:12
阅读 1238·2019-08-29 14:07
阅读 1223·2019-08-29 12:53