在多线程同时操作一个变量的时候,类似++这种方式,用锁就显得大材小用了,所以用到了atomic原子类,可以保证在多线程的情况下,安全高性能的执行程序更新变量,atomic原子类的底层不是传统意义上的锁机制,而是无锁化的cas机制,CAS 全称compare and set 比较后再设置
简单理解就是多线程操作的情况下先获取一个值,看谁先发起cas操作,判断时候和获取的时候值一样 如果一样就修改值,如果不一样就重新获取再进行修改
jdk1.8之前内就是通过cas机制不断地循环判断,这样在并发量高的情况下很容易造成资源和性能的浪费,所以在1.8之后对atomci原子类进行了优化加入了分段锁的概念
在LongAdder底层实现过程中,有个base值,当并发量提升之后就会分段实施cas操作,把基数分不到多个段中,这样就降低了更新同一个数值时的cas操作,当一段cas操作失败之后就会去其他段进行操作,如果获取总值就把剩下的加起来
atomic原子类包含
基本类型:使用原子的方式更新基本类型
a. AtomicInteger整形原子类 b. AtomicLong长整型原子类 c. AtomicBoolean布尔原子类
数组类型:使用原子的方式更新数组中某个元素
a. AtomicIntegerArray:整形数组原子类 b. AtomicLongArray:长整形数组原子类 c.
AtomicReferenceArray:引用类型数组原子类(即对应数组中存放的元素为对象形式)
引用类型:使用原子的方式更新某个对象
a. AtomicReference:引用类型原子类 b.
AtomicStampedReference:AtomicReference的扩展版,增加了一个参数stamp标记,这里是为了解决了AtomicInteger和AtomicLong的操作会出现ABA问题。
c. AtomicMarkableReference
:与AtomicStampedReference差不多,只不过第二个参数不是用的int作为标志,而用boolean类型做标记,具体用法看后面讲解。
对象的属性修改类型:使用原子的方式更新某个类中某个字段
a. AtomicIntegerFieldUpdater:原子更新整形字段的更新器 b.
AtomicLongFieldUpdater:原子更新长整形字段的更新器 c.
AtomicReferenceFieldUpdater:原子更新引用类型字段的更新器