锁:AbstractQueuedSynchronizer源码

1、java锁

隐式锁( synchronized, 他是基于jvm内置锁),加锁与解锁的过程不需要我们在代码当中人为的控制,jvm会自动去加锁跟解锁

显式锁 ReentrantLock, 一个可重入的锁整个加锁跟解锁过程需要我们手动编写代码去控制

 

2、AbstractQueuedSynchronizer源码

(1)ReentrantLock的构造方法

锁:AbstractQueuedSynchronizer源码_第1张图片

 

 

 (2)是悲观锁

锁:AbstractQueuedSynchronizer源码_第2张图片

 

 

 (3)公平锁FairSync

锁:AbstractQueuedSynchronizer源码_第3张图片

 

 

 (4)可重入锁(讲解AQS)

锁:AbstractQueuedSynchronizer源码_第4张图片

 

 

  可重入就是说某个线程已经获得某个锁,可以再次获取锁而不会出现死锁。ReentrantLock 和 synchronized 不一样,需要手动释放锁,所以使用 ReentrantLock的时候一定要手动释放锁,并且加锁次数和释放次数要一样,否则其他线程会一直等待

  解锁的时候state会减1,execlusiveOwnerThread为null的时候代表解锁完毕且state为0

多线程的情况:

锁:AbstractQueuedSynchronizer源码_第5张图片

 

 

 锁:AbstractQueuedSynchronizer源码_第6张图片

 

 

 图解多线程的情况:

锁:AbstractQueuedSynchronizer源码_第7张图片

 

 

由于线程1已经加锁,state=1,线程2加锁失败需要进行排队,只能够等到线程1执行完毕释放锁,state=0且exclusive OwnerThread=null的时候会唤醒等待的线程2

公平锁具有先来先排队,且先来的具有获取锁的优先权的特点

(5)CLH队列(双向链表)

CLH队列是Craig、Landin. Hagersten 三人发明的一种基于双向链表数据结构的队列 。Java中的CLH队列是原CLH队列的一个变种,线程由原自旋机制改为阻塞机制

锁:AbstractQueuedSynchronizer源码_第8张图片

 

 

 锁:AbstractQueuedSynchronizer源码_第9张图片

 

 

 移除节点的操作:

锁:AbstractQueuedSynchronizer源码_第10张图片

 

锁:AbstractQueuedSynchronizer源码_第11张图片

 

 

 增加结点的操作:

锁:AbstractQueuedSynchronizer源码_第12张图片

 

 

线程的状态:

锁:AbstractQueuedSynchronizer源码_第13张图片

 

 

 条件队列:

在put函数中已经有获取锁的操作,在执行await函数的时候是需要释放锁的。

锁:AbstractQueuedSynchronizer源码_第14张图片

 

 

锁:AbstractQueuedSynchronizer源码_第15张图片 

条件队列队满的处理方式:

锁:AbstractQueuedSynchronizer源码_第16张图片

 

 

 (6)非公平锁

锁:AbstractQueuedSynchronizer源码_第17张图片

 

你可能感兴趣的:(锁:AbstractQueuedSynchronizer源码)