Java juc源码笔记合集

[TOC]

这是一个Java juc源码笔记合集。

队列同步器AQS

AbstractQueuedSynchronizer抽象队列同步器。

Lock接口提供加锁、解锁的统一入口,是面向锁使用者的。

自定义锁实现时,实现Lock接口,内部类继承AQS,实现AQS的tryAcquire/tryRelease(或tryAcquireShared/tryReleaseShared),完成具体的锁获取逻辑,比如是否公平、对同步状态的变更等,是面向锁开发者的。

AQS封装了排队(什么时候阻塞、什么时候去获取锁)的逻辑。

公平与非公平

公平与非公平,是针对非排队的线程而言的。

对排队中的线程,都是公平的,需要按照队列顺序,当前驱节点是head时,才有资格tryAcquire,即尝试获取锁。

非公平是指,在队列中的线程刚被唤醒、还没来得及获取到锁时,不在排队中的、其他的线程可能先获取到了锁。以ReentrantLock的nonfaireSync为例,只要当前线程看到state为0、且cas成为1,当前线程就获取到了锁。

acquire流程

acquire是AQS提供给Lock的加锁入口。

Condition

AQS-同步队列 sync queue

condition-条件队列

CountDownLatch

怎么用?

首先设置一个状态n,latch被countDown1次,状态就自减1。状态为0,表示”栅栏“。

假设多个线程要到同一个状态前再同时开始工作,那么可以调用latch.await(),等latch状态为0,就会被唤醒同时工作。