Java的Lock实现类介绍

Java的Lock实现类介绍

Java的Lock实现类介绍
  1. 所的实现类:AQS(AbstractQueuedSynchronizer)、ReentrantLock、ReentrantReadWriteLock,CountDownLatch,Semphore。
  2. 其他多线程协作的场景: CyclicBarrier。
  3. AQS源码解析。
Lock类介绍
Lock类相关介绍
  1. Lock重要的实现类:ReentrantLock 和 ReentrantReadWriteLock。
  2. Lock:定义了标准的Lock的api。
  3. ReentrantLock :重入锁(实现了AQS) 支持公平和非公平。
  4. ReentrantReadWriteLock:同ReentrantLock 在基础上支持读写分离适合多读少写的场景
  5. Condition:是需要与Lock配合使用的,提供多个等待集合,更精确的控制(底层是park/unpark机制)
Lock类定义

API定义:
Java的Lock实现类介绍_第1张图片
总结:
1、lock()最常用;
2、lockInterruptibly()方法一般更昂贵,有的impl可能没有实现lockInterruptibly(),
只有真的需要效应中断时,才使用,使用之前看看impl对该方法的描述。
Condition:
用于替代wait/notify。
Object中的wait(),notify(),notifyAll()方法是和synchronized配合使用的,可以唤醒一个或者全部(单个等待集);
Condition是需要与Lock配合使用的,提供多个等待集合,更精确的控制(底层是park/unpark机制);

AOS(抽象队列同步器)
  1. AOS核心方法
    Java的Lock实现类介绍_第2张图片
    提供了对资源占用、释放,线程的挂起、唤醒的逻辑。
    预留了各种try 方法给用户实现
    可以用在各种需要控制资源争用的场景中。(ReentrantLock/CountDownLatch/Semphore)

  2. AQS
    state 不是记录有多少在等待 而是记录了抢占到的线程的同步状态表示(int型的) 重入的时候这个值也是会累加的
    exclusiveOwnerThread 记录了当前占有锁的线程
    类中包含了一个Node类
    Node head , tail 链表结构的队列
    Sync 的子类是先公平和非公平 NonfairSync 和 FairSync
    Condition 实现类 ConditionObject 是AQS实现 是在Lock里面 所以是和锁关联起来的 是通过park/unpark实现的
    每个Condition 里面是包含了一个队列

ReadWriteLock类

Java的Lock实现类介绍_第3张图片

ReentrantReadWriteLock
包含:WriteLock 和 ReadLock
实现共享锁的方式是采用了

CountDownLatch类

闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状态也就不能变了,只能是打开状态。也就是说闭锁的状态是一次性的,它确保在闭锁打开之前所有特定的活动都需要在闭锁打开之后才能完成。
也是采用的AQS的state技术 当达到倒0的时候表示所有的都可以向下运行

Semaphore类

Semaphore类是一个计数信号量,必须由获取它的线程释放,
通常用于限制可以访问某些资源(物理或逻辑的)线程数目。

也是采用的AQS的state技术 通过state来控制线程数量 state表示线程操作的数量

CyclicBarrier类

栅栏类似于闭锁,它能阻塞一组线程直到某个事件的发生。栅栏与闭锁的关键区别在于,所有的线程必须同时到达栅栏位置,才能继续执行。闭锁用于等待事件,而栅栏用于等待其他线程。
不是直接用AQS实现的 是采用了ReentrantLock 代用重入性质的

你可能感兴趣的:(java,语言)