1、AtomicInteger 的用法
这个类中提供了线程安全的加减乘除的方式,如下所示:
2、AtomicInteger原子整数
2.1) incrementAndGet方法
incrementAndGet对应的源码
其中this代表AtomicInteger类的一个对象,valueOffset代表域的偏移量,1代表要加的值,这里是加1,unsafe对象是和cpu 打交道的一个对象,里面提供了compareAndSet方法来保证线程执行的原子性,进入unsafe的getAndAddInt方法,如下:
在unsafe方法中,是提供了getIntVolatile(var1, var2)方法,根据AtomicInteger对象和域的偏移量可以获得主存中的最新的value值,然后通过unsafe提供的compareAndSwapInt(var1, var2, var5, var4 + var5) 方法来进行更新值,
为什么AtomicInteger 中属性value 为啥要用volatile修饰:
为了配合cas,cas每次要从主存中获取最新的值,然后和线程中的值相比。
还有另外一个点是提供了原子更新值的类是Unsafe方法,里面有compareAndSwapInt类似这样的方法。
addAndGet方法和incrementAndGet差不多,唯一不同的是addAndGet更新值加的不是1而是自定义的值
2.2) updateAndGet 方法
该方法如下:
首先获得prev的值,这是这个线程得到的值,然后通过自定义的IntUnaryOperator的实现,也就是IntUnaryOperator的一个对象来调用applyAsInt方法,对value进行计算,然后调用compareAndSet(prev, next), 进入compareAndSet方法
底层根据AtomicInteger对象var1, value的域偏移量var2, 期望的值var4,这个值是要和主存中的值比较的,如果相等,则将value的值更新为var5。
文章评论