菜鸟笔记
提升您的技术认知

CAS的特性,乐观锁

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关键字更轻量级的同步机制。