Java并发机制底层实现原理

锁的膨胀过程

预备知识CAS

硬件对并发的支持

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

模拟CAS操作

1public class SimpleCAS { 2 3 private Integer value; 4 5 private synchronized int get(){ 6 return value; 7 } 8 private synchronized int compareAndSwap(int a, int b){ 9 int v = value; 10 return v == a ? b : v; 11 } 12 class CasCounter{ 13 private SimpleCAS simpleCAS; 14 private Integer getValue(){ 15 return simpleCAS.get(); 16 } 17 private Integer increment(){ 18 Integer v; 19 do { 20 v = simpleCAS.get(); 21 } 22 while (v != simpleCAS.compareAndSwap(v, v + 1)); 23 return v + 1; 24 } 25 } 26}

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

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

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

流程图

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

1、AQS类设计的主要属性

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

2、Node类的设计

1static final class Node { 2 volatile Node prev; 3 volatile Node next; 4 volatile Thread thread; 5}

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

点赞
收藏

评论区

加载中...

相关推荐

Oracle 分组与拼接字符串同时使用

SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java CAS compareAndSet, compareAndSwap 区别

之前看源代码的时候,发现了有两个方法。一个是compareAndSet,一个是compareAndSwap,傻傻分不清这两个到底哪个是CAS呢。我看了java并发编程实战找到了答案。CAS是一种计算机的指令。CAS包含3个操作数,需要读写的内存位置V,进行比较的值A和拟写入的新值B。当且仅当V的值等于A时,C

java多线程之CAS

CAS(CompareandSwap)CAS字面意思为比较并交换.CAS有3个操作数,分别是:内存值M,期望值E,更新值U。当且仅当内存值M和期望值E相等时,将内存值M修改为U,否则什么都不做。1.CAS的应用场景CAS只适用于线程冲突较少的情况。CAS的典型应用场景是:

Java多线程并发06——CAS与AQS

在进行更近一步的了解Java锁的知识之前,我们需要先了解与锁有关的两个概念CAS与AQS。关注我的公众号「Java面典」了解更多Java相关知识点。CAS(CompareAndSwap/Set)概念CAS函数,是比较并交换函数,它是原子操作函数。原理CA

Java多线程(二)

\恢复内容开始一,volatile关键字当多个线程操作共享数据时,可以保证内存中的数据可见性相较于synchronized关键字:1,不具备“互斥性”2,不能保证变量的原子性二,原子变量volatile保证内存可见性CAS(CompareAndSwap)算法保证数据的原子性内存值V预估值A更新值