AtomicInteger源码分析

在Java的多线程开发中需要做一些同步的操作。
在java concurrent库中提供了一系列支持原子操作的类,在atomic包下。
这里分析其中的AtomicInteger源码,来看看他是如何实现原子操作的。

AtomicInteger源码比较简单,主要的操作是对一个int值进行加减操作。
但是其中应用到了一个神奇的类Unsafe.java.

Unsafe.java提供了一些列的方法支持对JVM内存的操作(当然了他提供的功能远远不止操作内存)。
你看的没错是直接的操作内存,这个对于习惯了写Java程序时由GC直接管理内存的我这个小白来说,简直是三观尽毁。

Unsafe.java竟然是反Java常规的,那么想要使用它也不是那么随便的。默认Unsafe.java只信任JDK中的类,所以在自定义的类中不能直接实例化这个类,当然你还是可以通过反射来获取该对象。(额,扯远了)

通过观察代码发现AtomicInteger的原子性就是通过Unsafe.java来实现的。主要代码如下:

private static final Unsafe unsafe = Unsafe.getUnsafe();
private static final long valueOffset;
static {    
      try {        
        valueOffset = unsafe.objectFieldOffset(AtomicInteger.class.getDeclaredField("value"));    
      } catch (Exception ex) { 
            throw new Error(ex);
      }
}

private volatile int value; //注意value变量的volatile属性

功能:

  • 获取Unsafe对象
  • 通过反射获取AtomicInteger类中value在内存中的位置。
public final boolean compareAndSet(int expect, int update) {   
       return unsafe.compareAndSwapInt(this, valueOffset, expect, update);
}

功能:
通过CAS算法,设置value的值。CAS算法就是先比较value的值和expect的值是否相同,如果相同就设置update。如果不相同则设置失败。

这样就保证了,对value的原子操作。

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 序 阅读java源码可能是每一个java程序员的必修课,只有知其所以然,才能更好的使用java,写出更优美的程序,...
    会吹B的码农阅读 558评论 2 0
  • Java8张图 11、字符串不变性 12、equals()方法、hashCode()方法的区别 13、...
    Miley_MOJIE阅读 3,931评论 0 11
  • 一、变量 (一)局部变量 此处声明的相当于一个局部变量,在end之后便失效。声明多个: (二)会话变量 此处的se...
    虞锦雯阅读 1,332评论 0 1
  • 当年一曲《同桌的你》掀起了一股校园民谣风,那时老狼是高晓松睡在上铺的兄弟,那时朴树还唱着白桦林红得一塌糊涂,...
    陈九九Jo阅读 428评论 0 1
  • 谈谈刚发生小故事,深深的体会,今天晚上一直都在加班,各种赶稿子,终于思路理的差不多,小有成就感了。 ...
    点紫阅读 253评论 0 0

友情链接更多精彩内容