cas(compare and swap)
指比较并转换,cas算法包含三个参数 cas(v,en),v表示要更新的变量,e表示预期的值,n表示新值,
有仅在v值等于e值时,才会将v值设置成n值,如果v跟e值不同,则说明有其他线程做了更新,当前线程什么都不做,最后返回cas当前v的真实值;
cas操作采用了乐观锁的思想
乐观嘛,总是以为自己可以成功完成操作。在多个线程同时使用时使用cas操作一个变量时,只有一个线程会胜出并成功更新,其余均失败,失败的线程不会被挂起,并且允许再次尝试;cas即使没有锁,也可以发现其他线程对当前线程的干扰;
cas自旋等待
在jdk包中 java.util.concurrent.atomic
里提供了一组类,这些类的基本特性就是在多线程环境下,内部就是基于cas算法实现的=====既是某个线程进入方法中执行其中的指令时,不会被其他线程打断,而别的线程就像是自旋锁一样,一直等到该方法执行完成才由jvm的等待队列中选择一个线程进入;
相比synchronized阻塞算法,cas是非阻塞算法的一种常见实现
来段代码感受一下:
import com.sun.org.apache.xpath.internal.operations.number;
import java.io.serializable;
public class cas extends number implements serializable {
private volatile int value;
public final int get() {
return value;
}
public final int getcas() {
for (; ; ) {
//cas自旋,一直尝试,直到成功
int current = get();
int next = current 1;
if (compareandset(current, next)) {
return current;
}
}
}
public final boolean compareandset(int current, int next) {
return unsafe.compareandset(this, valueoffset, expect, update);
}
}
volatile变量
java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。