JUC9 Atomic_原子类

1. Atomic :java.util.concurrent.atomic 基于CAS实现

(1). 基本类型原子类(AtomicInteger、AtomicBoolean、AtomicLong)
(2). 数组类型原子类 (AtomicIntegerArray、AtomicLongArray、AtomicReferenceArray)
(3). 引用类型原子类 (AtomicReference、AtomicStampedReference、AtomicMarkableReference)
(4). 对象的属性修改原子类 (AtomicIntegerFieldUp dater、AtomicLongFieldUpdater、AtomicRefere nceFieldUpdater)
(5). 原子操作增强类(DoubleAccumulator 、DoubleAdder 、LongAccumulator 、LongAdder)
(6). 第17位罗汉:Striped64 第18位罗汉: Number

·AtomicBoolean:原子更新布尔类型。
·AtomicInteger:原子更新整型。
·AtomicLong:原子更新长整型。
 

·AtomicIntegerArray:原子更新整型数组里的元素。
·AtomicLongArray:原子更新长整型数组里的元素。
·AtomicReferenceArray:原子更新引用类型数组里的元素。
·AtomicIntegerArray类主要是提供原子的方式更新数组里的整型
 

·AtomicReference:原子更新引用类型。
·AtomicReferenceFieldUpdater:原子更新引用类型里的字段。
·AtomicMarkableReference:原子更新带有标记位的引用类型。
 

·AtomicIntegerFieldUpdater:原子更新整型的字段的更新器。
·AtomicLongFieldUpdater:原子更新长整型字段的更新器。
·AtomicStampedReference:原子更新带有版本号的引用类型。
 

JUC9 Atomic_java_02

2. 基本类型原子类

①. 常用API简介

JUC9 Atomic_java_03

②. AtomicInteger解决 i++ 多线程下不安全问题

③. AtomicBoolean可以作为中断标识停止线程的方式
 

3. 数组类型原子类

4. 引用类型原子类

①.使用AtomicReference来实现自旋锁案例

//自旋锁
public class AtomicReferenceThreadDemo {
static AtomicReference<Thread>atomicReference=new AtomicReference<>();
static Thread thread;
public static void lock(){
thread=Thread.currentThread();
System.out.println(Thread.currentThread().getName()+"\t"+"coming.....");
while(!atomicReference.compareAndSet(null,thread)){

}
}
public static void unlock(){
System.out.println(Thread.currentThread().getName()+"\t"+"over.....");
atomicReference.compareAndSet(thread,null);
}
public static void main(String[] args) {
new Thread(()->{
AtomicReferenceThreadDemo.lock();
try { TimeUnit.SECONDS.sleep(3); } catch (InterruptedException e) {e.printStackTrace();}
AtomicReferenceThreadDemo.unlock();
},"A").start();

new Thread(()->{
AtomicReferenceThreadDemo.lock();
AtomicReferenceThreadDemo.unlock();
},"B").start();
}
}

②. AtomicStampedReference 解决ABA问题:通过版本号,解决修改过几次

③. AtomicMarkableReference 不建议用它解决ABA问题:通过标志位,解决是否修改

5. 对象的属性修改原子类

是什么:更细粒度的原子更新,精细到字段(某个类的某个字段)。

锁对象 -> 锁变量;比喻:全身麻醉 -> 局部麻醉

目的:以一种线程安全的方式操作非线程安全对象内的某些字段。以达到精确加锁+节约内存的目的。

JUC9 Atomic_原子类_04

使用要求:更新的对象属性必须使用public volatile修饰符;因为对象的属性修改类型原子类都是抽象类,所以每次使用都必须使用静态方法newUpdater( )创建一个更新器,并且需要设置想要更新的类和属性

JUC9 Atomic_原子类_05

考点:你在哪里用到了volatile:

单例设置模式(双端检锁机制)

AtomicIntegerFieldUpdater、AtomicLongFieldUpdater、AtomicReferenceFieldUpdater

6. 原子操作增强类

AtomicLong的底层是CAS+自旋锁的思想,适用于低并发的全局计算,高并发后性能急剧下降,原因如下:N个线程CAS操作修改线程的值,每次只有一个成功过,其他N-1失败,失败的不停的自旋直到成功,这样大量失败自旋的情况,一下子cpu就打高了(AtomicLong的自旋会成为瓶颈)
在高并发的情况下,我们使用LoadAdder,LoadAdder可以化整为零,分散热点,多个Cell进行CAS

JUC9 Atomic_java_06

JUC9 Atomic_java_07

JUC9 Atomic_jvm_08

AtomicLong和LongAdder的分别:

 

JUC9 Atomic_jvm_09

7. 第17位罗汉:Striped64 第18位罗汉: Number