前言
接下来会出一系列文章来分析 ReentrantLock
的源码, 在此之前需要具备很多基础, 因为说到 A 知识点可能牵扯出 B 知识点, 又扯出 C 知识点, 一环扣一环, 本文先从最基础的开始了解。
正文
先来看一些并发相关的小知识
原子性
原子性操作是指执行一系列操作时, 要么全部执行, 要么全部不执行。
类似数据库事务的原子性。
CAS 操作
CAS 全称是 Compare And Swap
。实现了非阻塞原子性操作, sun.misc.Unsafe
类中提供了一系列 CAS 操作。
独占锁和共享锁
根据锁只能被单线程持有, 还是能被多个线程一同持有, 来判定一个锁为独占锁还是共享锁。
独占锁保证任意时刻, 只能被一个线程持有, 比如 ReentrantLock
, 而共享锁可以同时被多个线程持有, 比如 ReentrantReadWriteLock
。
可重入锁
当多个线程同时去抢占一个独占锁时, 只能有一个线程可以获得, 其余的线程将会被阻塞。
而那个持有锁的线程, 再次去获取锁时, 如果不被阻塞, 那么这个锁就被称为可重入锁。
比如 synchronized
和 ReentrantLock
。
公平锁和非公平锁
公平锁表示线程获取锁的顺序是根据 先来后到 来决定的, 公平锁则表示后来的也可以插队。
ReentrantLock
可以通过构造参数的方式去决定 new 出来的是一个公平锁 还是 非公平锁。
-
公平锁
ReentrantLock fairLock = new ReentrantLock(true)
-
非公平锁
ReentranLock nonFairLock = new ReentrantLock(false);
总结
以上就是分析 ReentrantLcok
源码之前必备的小知识, 下一篇仍然不会深入到源码, 而是讲几个并发公共基础类。