1、CAS 原理
CAS 全称是 compare and swap,是一种用于在多线程环境下实现同步功能的机制。
CAS 操作包含三个操作数 – 内存位置、预期数值和新值。
CAS 的实现逻辑是将内存位置处的数值与预期数值进行比较,若相等,则将内存位置处的值替换为新值;若不相等,则重新读取内存值。
update table set value = newValue where value = #{oldValue}
带上版本号能防止ABA:
update table set value = newValue ,vision = vision + 1 where value = #{oldValue} and vision = #{vision}
应用:
sun.misc.Unsafe 类中 CAS 的应用
2、AQS 原理
AQS的全称是 AbstractQuenedSynchronizer 抽象队列同步器。该类在java.util.concurrent.locks包。
AQS的核心思想:
如果被请求的共享资源空闲,则将当前请求资源的线程设置为有效的工作线程,并将共享资源设置为锁定状态;如果被请求的共享资源被占用,那么就需要一套线程阻塞等待以及被唤醒时锁分配的机制,这个机制AQS是用CLH队列锁实现的,即将暂时获取不到锁的线程加入到队列中。
CLH队列
CLH(Craig,Landin,and Hagersten)队列是一个虚拟的双向队列,虚拟的双向队列即不存在队列实例,仅存在节点之间的关联关系。
private transient volatile Node head;
private transient volatile Node tail;
private volatile int state;
protected final int getState() {
return state;
}
protected final void setState(int newState) {
state = newState;
}
protected final boolean compareAndSetState(int expect, int update) {
return unsafe.compareAndSwapInt(this, stateOffset, expect, update);
}
Node节点
static final class Node {
static final Node SHARED = new Node();
static final Node EXCLUSIVE = null;
static final int CANCELLED = 1;
static final int SIGNAL = -1;
static final int CONDITION = -2;
static final int PROPAGATE = -3;
volatile int waitStatus;
volatile Node prev;
volatile Node next;
volatile Thread thread;
Node nextWaiter;
final boolean isShared() {
return nextWaiter == SHARED;
}
final Node predecessor() throws NullPointerException {
Node p = prev;
if (p == null)
throw new NullPointerException();
else
return p;
}
Node() {
}
Node(Thread thread, Node mode) {
this.nextWaiter = mode;
this.thread = thread;
}
Node(Thread thread, int waitStatus) {
this.waitStatus = waitStatus;
this.thread = thread;
}
}
主要应用