Java并发机制底层实现原理

Wesley13
• 阅读 619

锁的膨胀过程

预备知识CAS

硬件对并发的支持

在大多数处理器架构(包括IA32和Sparc)中采用的方法是实现一个比较并交换(CAS)指令,CAS包含了3个操作数——内存位置(V),预期原值(A),拟写入的新值(B),当且仅当V == A 时,CAS才会通过原子方式用新值(B)来更新(V)原有的值,无论操作成功与否,都会返回(V)值,且整个过程都是不可打断的,所以CAS是一个原子操作;主要是利用CPU的CAS指令,同时借助JNI来完成Java的非阻塞算法。

模拟CAS操作

public class SimpleCAS {

    private Integer value;

    private synchronized int get(){
        return value;
    }
    private synchronized int compareAndSwap(int a, int b){
        int v = value;
        return v == a ? b : v;
    }
    class CasCounter{
        private SimpleCAS simpleCAS;
        private Integer getValue(){
            return simpleCAS.get();
        }
        private Integer increment(){
            Integer v;
            do {
                v = simpleCAS.get();
            }
            while (v != simpleCAS.compareAndSwap(v,  v + 1));
            return v + 1;
        }
    }
}

预备知识 公平锁&非公平锁

公平锁:第一次加锁的时候,他不会去尝试加锁,他会去看一下我前面有没有人正在排队,如果有人排队,我就先去排队,进入队列后,如果前面那个人是head头结点,他会再次尝试加锁,成功则执行同步代码块,失败则park(真正的排队了);

非公平锁:他首先会在lock方法调用的时候去抢锁,如果失败,则会去看看为啥会失败(锁是不是被人持有了),如果没有人持有,非公平锁则会直接加锁(不会判断是否有人排队),成功则进入同步代码块,失败则进入队列。

流程图

Java并发机制底层实现原理

关于队列如何设计和形成的

1、AQS类设计的主要属性

private transient volatile Node head;/队首
private transient volatile Node tail;//队尾
private volatile int state;//锁状态标识

2、Node类的设计

static final class Node {
        volatile Node prev;
        volatile Node next;
        volatile Thread thread;
}

Java并发机制底层实现原理

同步器包含了两种节点类型的引用,一个指向头结点,而另外一个指向尾节点,没有成功获取同步状态的线程将会成为节点加入到该队列的尾部。

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
2年前
java CAS compareAndSet, compareAndSwap 区别
之前看源代码的时候,发现了有两个方法。一个是compareAndSet,一个是compareAndSwap,傻傻分不清这两个到底哪个是CAS呢。我看了java并发编程实战找到了答案。CAS是一种计算机的指令。CAS包含3个操作数,需要读写的内存位置V,进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,C
Wesley13 Wesley13
2年前
java多线程之CAS
CAS(CompareandSwap)CAS字面意思为比较并交换.CAS有3个操作数,分别是:内存值M,期望值E,更新值U。当且仅当内存值M和期望值E相等时,将内存值M修改为U,否则什么都不做。1.CAS的应用场景CAS只适用于线程冲突较少的情况。CAS的典型应用场景是:
Wesley13 Wesley13
2年前
Java多线程并发06——CAS与AQS
在进行更近一步的了解Java锁的知识之前,我们需要先了解与锁有关的两个概念CAS与AQS。关注我的公众号「Java面典」了解更多Java相关知识点。CAS(CompareAndSwap/Set)概念CAS函数,是比较并交换函数,它是原子操作函数。原理CA
Wesley13 Wesley13
2年前
Java集合,ConcurrentHashMap底层实现和原理(常用于并发编程)
概述ConcurrentHashMap常用于并发编程,这里就从源码上来分析一下ConcurrentHashMap数据结构和底层原理。在开始之前先介绍一个算法,这个算法和Concurrent的实现是分不开的。CAS算法:CAS是英文单词CompareAndSwap的缩写,翻译过来就是比较并替换。CAS机制当中使用
Wesley13 Wesley13
2年前
Java多线程(二)
\恢复内容开始一,volatile关键字当多个线程操作共享数据时,可以保证内存中的数据可见性相较于synchronized关键字:1,不具备“互斥性”2,不能保证变量的原子性二,原子变量volatile保证内存可见性CAS(CompareAndSwap)算法保证数据的原子性内存值V预估值A更新值
Wesley13 Wesley13
2年前
Java多线程并发中 CAS 的使用与理解
一、CAS(CompareAndSwap):  CAS(CompareAndSwap),即比较并交换CAS(V,E,N)。是解决多线程并行情况下使用锁造成性能损耗的一种机制,CAS操作包含三个操作数——要更新的变量(V)、预期原值(E)和新值(N)。核心算法是如果V值等于E值,则将V的值设为N。若V值和E值不同,则说明已经有其他线
Wesley13 Wesley13
2年前
Java锁事之Unsafe、CAS、AQS知识点总结
!(https://oscimg.oschina.net/oscnet/e14679ca0bdd2b95aa5869200e6bbaefff2.gif)关注“Java艺术”一起来充电吧!Unsafe、CAS、AQS是我们了解Java中除synchronized之外的锁必须要掌握的重要知识点。CAS是一个比较和替换的原子操作,AQS的实现
Wesley13 Wesley13
2年前
ABA问题的本质及其解决办法
点击上方的蓝字关注我吧_程序那些事_简介CAS的全称是compareandswap,它是java同步类的基础,java.util.concurrent中的同步类基本上都是使用CAS来实现其原子性的。CAS的原理其实很简单,为了保证在多线程环境下我们的更新是符合预期的,或者说一个线程在更新某个对象的时
Wesley13 Wesley13
2年前
CAS机制与自旋锁
CAS(CompareandSwap),即比较并替换,java并发包中许多Atomic的类的底层原理都是CAS。它的功能是判断内存中某个地址的值是否为预期值,如果是就改变成新值,整个过程具有原子性。具体体现于sun.misc.Unsafe类中的native方法,调用这些native方法,JVM会帮我们实现汇编指令,这些指令是CPU的原子指令,因此