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

cas的特性,乐观锁-ag真人游戏

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

网站地图