2021-05-14

Atomic、自旋锁、CAS、JUC

Atomic:是Java自带的一个包,该包中的类方便在多线程环境中,不使用锁的情况下进行原子操作。

有其几种分类:

1. 基本类型
2. 数组类型
3. 引用类型

基本类型:

1. AtomicInteger:		整型原子类
2. AtomicLong:			长整型原子类
3. AtomicBoolean:		布尔型原子类

数据类型:

1. AtomicIntegerArray:		整型数组原子类
2. AtomicLongArray:			长整型数组原子类
3. AtomicReferenceArray:	引用类型数组原子类

引用类型:

1. AtomicReference: 		引用型原子类
2. AtomicStampedReference:	原子更新带有版本号的引用类型
3. AtomicMarkableReference:	原子更新带有标记位的引用类型

对象属性修改类型:

1. AtomicIntegerFieldUpdater:		原子更新整型字段的更新
2. AtomicLongFileldUpdater:			原子更新长整型字段的更新器

CAS(Compare and swap)比较和替换:

适用于Atomic中的类型,在多线程的工程中。是一条CPU并发原语。
是依赖于硬件的一种功能,通过多条连续的原语,来对一个数据进行操作,
所以说CAS是一条CPU原子指令,不会造成数据不一致。
原语:操作系统语言范畴,用于直接操作系统资源。

缺点:

1. 循环时间长,开销时间大,浪费CPU资源
2. 只能保证一个共享变量的操作
3. 可能会有ABA问题,假定一个数据是A,而修改之后数据为B,最后又修改为A,则当前线程的CAS操作无法辨认当前的数据A是否发生过变化

Unsafe:

是CAS的核心类,来自于rt.jar/sun/misc。 

在不使用锁的情况下对数据进行读写,由于无法使用直接使用系统资源,所以只能使用系统的Unsafe类,一旦有方法使用 native 修饰,那么Java便无法直接只用该方法。而Unsafe相当于sun公司留的后门,可以直接操作特定内存的数据。

其内部的方法操作可以像C的指针一样操作内存,而比如像 AtomicInteger等数据,在多线程中不加锁的情况下可以实现不出错,是因为CAS在使用Unsafe的时候,通过对象在系统内存中的位置偏移地址,直接对系统内存地址中的数据执行了操作。
而且在最后所有的变量都会使用Volatile修饰,将其暴露给其他线程。

自旋锁:

在没有获得锁的情况下,反复去请求锁,期间可以做其他的事情,
其特点为非阻塞,浪费CPU资源
上一篇:Unsafe.putOrderedXXX系列方法详解(数组赋值的第二种方式)


下一篇:JDK8---UnSafe类实现CAS乐观锁