并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)

Posted 小明学习心得

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)相关的知识,希望对你有一定的参考价值。

4、显式锁和AQS

显式锁

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_并发

Lock接口和核心方法

lock():添加锁

unlock():释放锁

trylock()这个方法确保了在需要锁的时候,是未加锁的状态。返回true,表示是未加锁的,返回false表示已加锁

Lock接口和synchronized的比较:synchronized关键字语言层面,调用cpu指令实现,lock由类在语法层面(类级别)

synchronized 代码简洁,Lock:获取锁可以被中断,超时获取锁,尝试获取锁,读多写少用读写锁

可重入锁ReentrantLock、所谓锁的公平和非公平

如果在时间上,先对锁进行获取的请求,一定先被满足,这个锁就是公平的,不满足,就是非公平的

非公平的效率一般来讲更高

ReentrantLock(boolean ture )实现公平锁

ReadWriteLock接口和读写锁ReentrantReadWriteLock

ReentrantLock和Syn关键字,都是排他锁,只能有一个线程访问

读写锁:同一时刻允许多个读线程同时访问,但是写线程访问的时候,所有的读和写都被阻塞,最适宜与读多写少的情况,提升10倍性能

Condition接口(等待和通知)ConditionLock实现类 await()方法,一个Lock可以new多个Condition

用Lock和Condition实现等待通知

了解LockSupport工具

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_加锁_02

park开头的方法

负责阻塞线程

unpark(Thread thread)方法

负责唤醒线程

AbstractQueuedSynchronizer(抽象队列同步器)深入分析

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_读写锁_03

什么是AQS?学习它的必要性

AQS使用方式和其中的设计模式

继承,模板方法设计模式

了解其中的方法

模板方法:

独占式获取

accquire

acquireInterruptibly

tryAcquireNanos

共享式获取

acquireShared

acquireSharedInterruptibly

tryAcquireSharedNanos

独占式释放锁

release

共享式释放锁

releaseShared

需要子类覆盖的流程方法

独占式获取  tryAcquire

独占式释放  tryRelease

共享式获取 tryAcquireShared

共享式释放  tryReleaseShared

这个同步器是否处于独占模式  isHeldExclusively

同步状态state:

getState:获取当前的同步状态

setState:设置当前同步状态

compareAndSetState 使用CAS设置状态,保证状态设置的原子性

AQS中的数据结构-节点和同步队列

竞争失败的线程会打包成Node放到同步队列,Node可能的状态里:

CANCELLED线程等待超时或者被中断了,需要从队列中移走

SIGNAL后续的节点等待状态,当前节点,通知后面的节点去运行

CONDITION :当前节点处于等待队列

PROPAGATE:共享,表示状态要往后面的节点传播

  1. 表示初始状态

节点在同步队列中的增加和移出

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_并发_04

独占式同步状态获取与释放

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_并发_05

其他同步状态获取与释放

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_高并发_06

Condition分析

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_加锁_07

节点在同步队列中的移动

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_高并发_08

重点:

并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)_加锁_09


以上是关于并发-显示锁Lock和独占锁AQS(AbstractQueuedSynchronizer)的主要内容,如果未能解决你的问题,请参考以下文章

Java高并发编程实战6,通过AQS源码分析lock()锁机制

并发编程--显示锁和AQS

并发编程—独占锁和共享锁

AQS-ReentrantLock

AQS ReentrantLock

AQS(AbstractQueuedSynchronizer)源码深度解析—同步队列以及独占式获取锁释放锁的原理一万字